[Cordova] 使用 AdMob Plus 外掛在 App 中顯示廣告

[Cordova] 使用 AdMob Plus 外掛在 App 中顯示廣告

之前在 Cordova 上用的 AdMob 外掛 cordova-plugin-admob-free

原作者目前已經沒有維護了,改成專心在 AdMob Plus 這個專案上面。

因此,今天就來把 cordova-plugin-admob-free 外掛換掉吧~

 

1. 安裝 AdMob Plus 外掛

首先,移除舊的 cordova-plugin-admob-free 和相依的外掛:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cordova plugin rm cordova-admob-sdk-updated
cordova plugin rm cordova-admob-sdk
cordova plugin rm cordova-plugin-admob-free
cordova plugin rm cordova-admob-sdk-updated cordova plugin rm cordova-admob-sdk cordova plugin rm cordova-plugin-admob-free
cordova plugin rm cordova-admob-sdk-updated
cordova plugin rm cordova-admob-sdk
cordova plugin rm cordova-plugin-admob-free

 

接著,要裝上新的 AdMob Plus (admob-plus-cordova) 外掛。

安裝時要帶入 AdMob 的應用程式 ID (Application ID)

這個值可以在 AdMob 官網 上取得,通常是像 ca-app-pub-xxxx~yyyy 這種格式的:

 

下面是我安裝 admob-plus-cordova 時使用的指令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
AD_APP_ID="ca-app-pub-1971976XXXXXXXXX~44YYYYYYYY"
cordova plugin add admob-plus-cordova --save --variable "APP_ID_ANDROID=${AD_APP_ID}" --variable "APP_ID_IOS=${AD_APP_ID}"
AD_APP_ID="ca-app-pub-1971976XXXXXXXXX~44YYYYYYYY" cordova plugin add admob-plus-cordova --save --variable "APP_ID_ANDROID=${AD_APP_ID}" --variable "APP_ID_IOS=${AD_APP_ID}"
AD_APP_ID="ca-app-pub-1971976XXXXXXXXX~44YYYYYYYY"
cordova plugin add admob-plus-cordova --save --variable "APP_ID_ANDROID=${AD_APP_ID}" --variable "APP_ID_IOS=${AD_APP_ID}"

 

2. 修改 config.xml

要在 Cordova 的 config.xml,加入下列的值。

其中關於 deployment-target 和 SwiftVersion 我是直接抄範例程式的,

需要的人可以再自己修改:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<widget>
<platform name="android">
<preference name="AndroidXEnabled" value="true" />
</platform>
<platform name="ios">
<preference name="deployment-target" value="12.0" />
<preference name="SwiftVersion" value="5.3" />
</platform>
</widget>
<widget> <platform name="android"> <preference name="AndroidXEnabled" value="true" /> </platform> <platform name="ios"> <preference name="deployment-target" value="12.0" /> <preference name="SwiftVersion" value="5.3" /> </platform> </widget>
<widget>
    <platform name="android">
        <preference name="AndroidXEnabled" value="true" />
    </platform>
    <platform name="ios">
        <preference name="deployment-target" value="12.0" />
        <preference name="SwiftVersion" value="5.3" />
    </platform>
</widget>

 

3. 使用 AdMob Plus 顯示廣告

原本呼叫 cordova-plugin-admob-free 外掛的程式碼,

也因為 admob-plus-cordova 提供的程式介面不同,而需要修改。

 

下面的程式,是用 admob-plus-cordova 顯示一個置底的廣告橫幅:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var bannerId = "ca-app-pub-1971976XXXXXXXXX/2808YYYYYY";
if (typeof admob !== "undefined")
{
if (!sessionStorage.adCreated) {
// We have no way to check whether ad is created before,
// so we store it into sessionStorage.
sessionStorage.adCreated = true;
admob.start();
banner = new admob.BannerAd({
adUnitId: bannerId,
});
banner.show();
}
}
else
{
console.log("AdMob is not ready, type=" + (typeof admob));
}
var bannerId = "ca-app-pub-1971976XXXXXXXXX/2808YYYYYY"; if (typeof admob !== "undefined") { if (!sessionStorage.adCreated) { // We have no way to check whether ad is created before, // so we store it into sessionStorage. sessionStorage.adCreated = true; admob.start(); banner = new admob.BannerAd({ adUnitId: bannerId, }); banner.show(); } } else { console.log("AdMob is not ready, type=" + (typeof admob)); }
var bannerId = "ca-app-pub-1971976XXXXXXXXX/2808YYYYYY";

if (typeof admob !== "undefined")
{
    if (!sessionStorage.adCreated) {
        // We have no way to check whether ad is created before,
        //   so we store it into sessionStorage.
        sessionStorage.adCreated = true;

        admob.start();

        banner = new admob.BannerAd({
            adUnitId: bannerId,
        });

        banner.show();
    }
}
else
{
    console.log("AdMob is not ready, type=" + (typeof admob));
}

 

這段程式裡,要注意的是要放的是廣告單元 ID (AD unit ID)

而不是安裝外掛時使用的應用程式 ID (Application ID)。

廣告單元 ID 一樣可以從 AdMob 官網 上取得,

通常是像 ca-app-pub-xxxx/yyyy 這種格式的:

 

如果不小心放入了應用程式 ID,那麼廣告會顯示不出來。

相反的,如果在安裝外掛時,放入了廣告單元 ID 的話,

那麼在 Android app 執行時,程式可能會像我遇到的一樣掛掉:

 

然後在 logcat 裡可以觀察到,AdMob 在抱怨無效的 Application ID:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
D/AndroidRuntime( 3803): Shutting down VM
E/AndroidRuntime( 3803): FATAL EXCEPTION: main
E/AndroidRuntime( 3803): Process: idv.ephrain.multilibrarylogin, PID: 3803
E/AndroidRuntime( 3803): java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException:
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803): * Invalid application ID. Follow instructions here: *
E/AndroidRuntime( 3803): * https://googlemobileadssdk.page.link/admob-android-update-manifest *
E/AndroidRuntime( 3803): * to find your app ID. *
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): at android.app.ActivityThread.installProvider(ActivityThread.java:5002)
E/AndroidRuntime( 3803): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4594)
E/AndroidRuntime( 3803): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534)
E/AndroidRuntime( 3803): at android.app.ActivityThread.access$1500(ActivityThread.java:151)
E/AndroidRuntime( 3803): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
E/AndroidRuntime( 3803): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 3803): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 3803): at android.app.ActivityThread.main(ActivityThread.java:5254)
E/AndroidRuntime( 3803): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 3803): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 3803): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/AndroidRuntime( 3803): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
E/AndroidRuntime( 3803): Caused by: java.lang.IllegalStateException:
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803): * Invalid application ID. Follow instructions here: *
E/AndroidRuntime( 3803): * https://googlemobileadssdk.page.link/admob-android-update-manifest *
E/AndroidRuntime( 3803): * to find your app ID. *
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): at com.google.android.gms.internal.ads.zzbhw.attachInfo(com.google.android.gms:play-services-ads-lite@@20.3.0:22)
E/AndroidRuntime( 3803): at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(com.google.android.gms:play-services-ads-lite@@20.3.0:1)
E/AndroidRuntime( 3803): at android.app.ActivityThread.installProvider(ActivityThread.java:4999)
E/AndroidRuntime( 3803): ... 11 more
I/Icing ( 2505): IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=null serviceId=30
W/ActivityManager( 1530): Force finishing activity 1 idv.ephrain.multilibrarylogin/.MainActivity
D/AndroidRuntime( 3803): Shutting down VM E/AndroidRuntime( 3803): FATAL EXCEPTION: main E/AndroidRuntime( 3803): Process: idv.ephrain.multilibrarylogin, PID: 3803 E/AndroidRuntime( 3803): java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: E/AndroidRuntime( 3803): E/AndroidRuntime( 3803): ****************************************************************************** E/AndroidRuntime( 3803): * Invalid application ID. Follow instructions here: * E/AndroidRuntime( 3803): * https://googlemobileadssdk.page.link/admob-android-update-manifest * E/AndroidRuntime( 3803): * to find your app ID. * E/AndroidRuntime( 3803): ****************************************************************************** E/AndroidRuntime( 3803): E/AndroidRuntime( 3803): E/AndroidRuntime( 3803): at android.app.ActivityThread.installProvider(ActivityThread.java:5002) E/AndroidRuntime( 3803): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4594) E/AndroidRuntime( 3803): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534) E/AndroidRuntime( 3803): at android.app.ActivityThread.access$1500(ActivityThread.java:151) E/AndroidRuntime( 3803): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) E/AndroidRuntime( 3803): at android.os.Handler.dispatchMessage(Handler.java:102) E/AndroidRuntime( 3803): at android.os.Looper.loop(Looper.java:135) E/AndroidRuntime( 3803): at android.app.ActivityThread.main(ActivityThread.java:5254) E/AndroidRuntime( 3803): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 3803): at java.lang.reflect.Method.invoke(Method.java:372) E/AndroidRuntime( 3803): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) E/AndroidRuntime( 3803): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) E/AndroidRuntime( 3803): Caused by: java.lang.IllegalStateException: E/AndroidRuntime( 3803): E/AndroidRuntime( 3803): ****************************************************************************** E/AndroidRuntime( 3803): * Invalid application ID. Follow instructions here: * E/AndroidRuntime( 3803): * https://googlemobileadssdk.page.link/admob-android-update-manifest * E/AndroidRuntime( 3803): * to find your app ID. * E/AndroidRuntime( 3803): ****************************************************************************** E/AndroidRuntime( 3803): E/AndroidRuntime( 3803): E/AndroidRuntime( 3803): at com.google.android.gms.internal.ads.zzbhw.attachInfo(com.google.android.gms:play-services-ads-lite@@20.3.0:22) E/AndroidRuntime( 3803): at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(com.google.android.gms:play-services-ads-lite@@20.3.0:1) E/AndroidRuntime( 3803): at android.app.ActivityThread.installProvider(ActivityThread.java:4999) E/AndroidRuntime( 3803): ... 11 more I/Icing ( 2505): IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=null serviceId=30 W/ActivityManager( 1530): Force finishing activity 1 idv.ephrain.multilibrarylogin/.MainActivity
D/AndroidRuntime( 3803): Shutting down VM
E/AndroidRuntime( 3803): FATAL EXCEPTION: main
E/AndroidRuntime( 3803): Process: idv.ephrain.multilibrarylogin, PID: 3803
E/AndroidRuntime( 3803): java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException:
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803): * Invalid application ID. Follow instructions here:                          *
E/AndroidRuntime( 3803): * https://googlemobileadssdk.page.link/admob-android-update-manifest         *
E/AndroidRuntime( 3803): * to find your app ID.                                                       *
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): 	at android.app.ActivityThread.installProvider(ActivityThread.java:5002)
E/AndroidRuntime( 3803): 	at android.app.ActivityThread.installContentProviders(ActivityThread.java:4594)
E/AndroidRuntime( 3803): 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534)
E/AndroidRuntime( 3803): 	at android.app.ActivityThread.access$1500(ActivityThread.java:151)
E/AndroidRuntime( 3803): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
E/AndroidRuntime( 3803): 	at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 3803): 	at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 3803): 	at android.app.ActivityThread.main(ActivityThread.java:5254)
E/AndroidRuntime( 3803): 	at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 3803): 	at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 3803): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/AndroidRuntime( 3803): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
E/AndroidRuntime( 3803): Caused by: java.lang.IllegalStateException:
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803): * Invalid application ID. Follow instructions here:                          *
E/AndroidRuntime( 3803): * https://googlemobileadssdk.page.link/admob-android-update-manifest         *
E/AndroidRuntime( 3803): * to find your app ID.                                                       *
E/AndroidRuntime( 3803): ******************************************************************************
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803):
E/AndroidRuntime( 3803): 	at com.google.android.gms.internal.ads.zzbhw.attachInfo(com.google.android.gms:play-services-ads-lite@@20.3.0:22)
E/AndroidRuntime( 3803): 	at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(com.google.android.gms:play-services-ads-lite@@20.3.0:1)
E/AndroidRuntime( 3803): 	at android.app.ActivityThread.installProvider(ActivityThread.java:4999)
E/AndroidRuntime( 3803): 	... 11 more
I/Icing   ( 2505): IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=null serviceId=30
W/ActivityManager( 1530):   Force finishing activity 1 idv.ephrain.multilibrarylogin/.MainActivity

 

所以要很小心,不要將廣告的應用程式 ID 和廣告單元 ID 搞混了~

 

另一個要注意的點,

就是我找不到要如何偵測 AdMob Plus 是否已經有建立廣告元件了…

因為 Cordova 裡面用的都是 WebView,

只要一換頁或重新整理,所有的 JavaScript 物件都會重建,

就連 Cordova 的 deviceready 事件都會重發。

但是先前已經產生的  

admob.BannerAd()
admob.BannerAd() 物件,

雖然在程式裡已經摸不到它,但廣告橫幅元件依然會存在…

 

為了解決這個問題,我是用  

sessionStorage
sessionStorage 來儲存廣告是否已經存在。

一旦建立了

admob.BannerAd()
admob.BannerAd() 物件,

我就在

sessionStorage
sessionStorage 放一個值,代表廣告已經建立。

這樣一旦換頁或重新整理,我依然可以知道現在是不是需要建立廣告元件~

 

上面幾點都完成後,

廣告就可以成功顯示出來囉:

 

參考資料:

Get Started  |  iOS  |  Google Developers

kotlin – Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider

(本頁面已被瀏覽過 833 次)

3 thoughts on “[Cordova] 使用 AdMob Plus 外掛在 App 中顯示廣告

  1. 你好,请问admob.NativeAd(), 可以被销毁或移除吗?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料