2015年6月11日 星期四

[Corona SDK] 如何加入廣告 - AdMob V2

很多人開發的APP都是免費的,
為了獲利,難免都會加作廣告,
我們就以很多人常用的AdMob來當範例。

首先,您必須到AdMob去申請一個帳號,
然後新增你要加入廣告的APP,
細節這邊就先不提了,
原則上,AdMob有二個樣式,
一個是橫幅(banner),一個是插頁(interstitial),
如果你是同時要支援AndroidiOS平台,
那各別都要申請,
也就是說,你總共會需要4個廣告編號。

接著我們來看程式部份:

Add plugin
首先,我們需要在build.settings加入plug-in:
settings =
{
 plugins =
    {
        ["plugin.google.play.services"] =
        {
            publisherId = "com.coronalabs"
        },        
    },
 android =
    {

        usesPermissions =
        {
            "android.permission.INTERNET",
            "android.permission.ACCESS_NETWORK_STATE",
        },
    },
}
另外,Android需要增加網路存取的權限

Show the Ads
要顯示廣告,只要按照以下寫法即可
local ads = require( "ads" )
local bannerAppID = "ca-app-pub-3001435268155896/xxxxxxxxxx"  --for your iOS banner
local interstitialAppID = "ca-app-pub-3001435268155896/xxxxxxxxxx"  --for your iOS interstitial
if ( system.getInfo("platformName") == "Android" ) then
    bannerAppID = "ca-app-pub-3001435268155896/xxxxxxxxxx"  --for your Android banner
    interstitialAppID = "ca-app-pub-3001435268155896/xxxxxxxxxx"  --for your Android interstitial
end

local adProvider = "admob"

local function adListener( event )
    local msg = event.response
    print( "Message from the ads library: ", msg )
 if (event.type == "banner") then
     if ( event.isError ) then
         print( "Error, no bannser ad received", msg )
     else
         print( "Got one banner AD" )
     end
 elseif(event.type == "interstitial") then
        if ( event.isError ) then
            print( "Error, no interstitial ad received", msg )
        elseif ( event.phase == "loaded" ) then
            print("interstitial ads got...")
        elseif ( event.phase == "shown" ) then
            print("interstitial has been shown and closed") 
        end
 end
end

ads.init( adProvider, bannerAppID, adListener )

ads.show( "banner", { x=0, y=0, appId=bannerAppID} )--show banner ads

ads.show( "interstitial", { x=0, y=0, appId=interstitialAppID} )--show banner ads

ads.hide() -- hide the ads
上面的bannerAppIDinterstitialAppID,就是你去AdMob申請得到的廣告unit id,

ads.init()只要做一次即可,
之後在ads.show()裡再帶入想要顯示的ads型態和對應的appId即可,

橫幅廣告Banner Ads
ads.show( "banner", { x=0, y=0, appId=bannerAppID} )可以顯示橫幅的廣告,
上面的參數裡,x=0, y=0表示要顯示在最上方,位置你可以自己決定,
所以程式的UI配置要先決定, 以不影響遊戲進行就好,
大部份不是最上方就最下方,
然後預留給它的寬度是整個螢幕寛度,
那高度呢?要預留多高才行?
AdMob有所謂的Smart Banners
手機上面, 在landscape模式時,高度是32,
在portrait模式時,高度是50,
平板上面,高度就是90,
不過,我有遇過手機上得到的banner高度是70左右,
為了保險起見,預留90或者100就能適合各種情形 

插頁廣告Interstitial Ads 
插頁廣告會佔用全螢幕,所以ads.show()裡傳入的x,y值就沒有差別,
插頁廣告最好不要太多,不然使用者可能會覺得很煩,
另外,插頁廣告下載需要一段時間,
所以我們最好是先預載到手機或平板上,如下面的方法:
ads.load( "interstitial", { appId=interstitialAppID } ) --load the "interstitial" ads in advance
這個動作可以程式一啓動就先做,
要顯示廣告時,先判斷是否已下載回來了:
if(ads.isLoaded("interstitial"))then
 ads.show( "interstitial", { x=0, y=0, appId=interstitialAppID } )
end
要注意的是,如果你呼叫過ads.show()
即使是ads.show( "banner", { x=0, y=0, appId=bannerAppID} )
ads.isLoaded("interstitial")都會變成false
在Android平台上,只要曾經呼叫過ads.load( "interstitial", { appId=interstitialAppID } ),
之後呼叫ads.show()後,雖然ads.isLoaded("interstitial")會被清為false
但是它會自已在reload,
可是在iOS平台,每次都必須呼叫ads.load( "interstitial", { appId=interstitialAppID } ), ads.isLoaded("interstitial")才會再度為true,

Ads只有在實機上才有用,
所以,上面的程式,最好是可以加上判斷,
也就是說system.getInfo( "environment" ) ~= "simulator"時才執行

沒有留言:

張貼留言