Monaca/admob/admob-plus
目次
admob-plusとは
admob-freeの後継
admob-freeとadmob-plusは同じ作者(ratsonさん)で、admob-plusでは以下が改善されてる。
- TypeScriptで記述
- ファーストクラスのプロミスAPI
- Swiftを使用してiOSパーツを書き換える
- Ionicの公式サポート
- 豊富なドキュメント
https://admob-plus.github.io/docs/faq.html
インストール
https://github.com/admob-plus/admob-plus
インストール方法
公式:https://admob-plus.github.io/docs/installation.html
プレビュー脇のタブから新規ターミナルを作成し、以下を実行
cordova plugin add cordova-admob-plus --variable APP_ID_ANDROID=ca-app-pub-3940256099942544~3347511713 --variable APP_ID_IOS=ca-app-pub-3940256099942544~1458002511
上記はadmob公式のサンプルidです。
cordova plugin add cordova-plugin-androidx cordova plugin add cordova-plugin-androidx-adapter
GDPR(EU一般データ保護規則)対応するために以下をインストール
cordova plugin add cordova-plugin-consent
サンプル設定
- examples/basicのサンプルをプロジェクト直下にコピーし、example.admob.basicだけ設定したAppId名に変更する
- examples/basicのwww/index.htmlの以下部分をwww/index.htmlへ貼り付ける
cp examples/basic/www/js/index.js www/js/
www/js/index.js
'use strict' const app = { initialize() { document.addEventListener( 'deviceready', this.onDeviceReady.bind(this), false, ) }, onDeviceReady() { this.receivedEvent('deviceready') this.showAds() // this.checkIsLoaded().then(() => this.showAds()) }, /* checkIsLoaded() { return admob.interstitial.isLoaded().then(result => { alert(result) return result }) }, */ showAds() { admob.banner.show({ id: 'test', npa: '1' }).catch(console.log) admob.interstitial .load({ id: 'test' }) .then(() => admob.interstitial.show()) .catch(console.log) admob.rewardVideo .load({ id: 'test' }) .then(() => admob.rewardVideo.show()) .catch(console.log) }, receivedEvent(id) { const parentElement = document.getElementById(id) const listeningElement = parentElement.querySelector('.listening') const receivedElement = parentElement.querySelector('.received') listeningElement.setAttribute('style', 'display:none;') receivedElement.setAttribute('style', 'display:block;') console.log(`Received Event: ${id}`) }, } app.initialize()
www/index.html
<div class="app"> <h1>AdMob Plus</h1> <div id="deviceready" class="blink"> <p class="event listening">Connecting to Device</p> <p class="event received">Device is Ready</p> </div> </div> <script type="text/javascript" src="cordova.js"></script> <script type="text/javascript" src="js/index.js"></script>
body内に上記を追加。
<script src="components/loader.js"></script>
がある場合はcordova.jsの読み込みは不要�。
admobが無いエラー
Uncaught ReferenceError: admob is not defined www/js/index.js:18
admob.banner.show({ // 18行目はここなので、admobがnullな様子。
monacaデバッガーでのみで、起動してるとこのようなエラーが出る。
Androidで以下確認すれば、このエラーは消える。
- ビルド/Androidアプリのビルド/カスタムビルドデバッガーからビルド開始する
バナーサンプル
公式バナーの使い方: https://admob-plus.github.io/docs/show-banner.html
www/index.html
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta http-equiv="Content-Security-Policy" content="default-src * data: gap: content: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"> <script src="components/loader.js"></script> <link rel="stylesheet" href="components/loader.css"> <link rel="stylesheet" href="css/style.css"> </head> <body> <div class="app"> <h1>AdMob Plus</h1> <div id="deviceready" class="blink"> <p class="event listening">Connecting to Device</p> <p class="event received">Device is Ready</p> </div> </div> <script type="text/javascript" src="js/index.js"></script> </body> </html>
www/js/index.js
document.addEventListener('deviceready', () => { admob.banner.show({ id: { // replace with your ad unit IDs android: 'ca-app-pub-3940256099942544/6300978111', ios: 'ca-app-pub-3940256099942544/2934735716', }, }).then(() => { setTimeout(() => { admob.banner.hide({ // replace with your ad unit IDs android: 'ca-app-pub-3940256099942544/6300978111', ios: 'ca-app-pub-3940256099942544/2934735716', }) }, 10000) }) }, false)
上記ca-app-pub-はadmobの公式サンプルのもの
iosは毎回アプリを閉じて開くと再生できた。
インステサンプル
www/js/index.js
document.addEventListener('deviceready', () => { this.showAds() // this.checkIsLoaded().then(() => this.showAds()) }, false) showAds() { admob.interstitial.load({ id: { // replace with your ad unit IDs android: 'ca-app-pub-3940256099942544/1033173712', ios: 'ca-app-pub-3940256099942544/4411468910', }, }).then(() => admob.interstitial.show())
上記ca-app-pub-はadmobの公式サンプルのもの
checkIsLoaded()を使うパターンはかなりの確率で、iosでうまくいかない場合がある。(2020/06/08現在)
リワードサンプル
www/js/index.js
document.addEventListener('deviceready', () => { showAds() }, false) showAds() { admob.rewardVideo.load({ id: { // replace with your ad unit IDs android: 'ca-app-pub-3940256099942544/5224354917', ios: 'ca-app-pub-3940256099942544/1712485313', }, }).then(() => admob.rewardVideo.show()) }
上記ca-app-pub-はadmobの公式サンプルのもの
リワードのisReady関数
isReadyは不安定でiosでかなりの確率で、ロードできない事があったので、使わないほうが良いかも。(2020/06/08現在)
document.addEventListener('deviceready', () => { // this.showAds() this.checkIsLoaded().then(() => this.showAds()) }, false) checkIsLoaded() { return admob.rewardVideo.isReady().then(result => { alert(result) return result }) },
testモードにする
admob.setDevMode(true)
idをtestとして省略
idをtestとして省略することもできる
バナー
admob.banner.show({ id: 'test', npa: '1' }).catch(console.log)
android再生確認。iosは毎回アプリを閉じて開くと再生できた。
インステ
admob.interstitial .load({ id: 'test' }) .then(() => admob.interstitial.show()) .catch(console.log)
android,ios再生確認。
リワード
admob.rewardVideo .load({ id: 'test' }) .then(() => admob.rewardVideo.show()) .catch(console.log)
android,ios再生確認。
Androidエラー
androidx.core:coreエラーが出るとき
> Task :app:processDebugManifest FAILED /tmp/download/platforms/android/app/src/main/AndroidManifest.xml:22:18-91 Error: Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory). Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:22:5-50:19 to override. See http://g.co/androidstudio/manifest-merger for more information about the manifest merger. FAILURE: Build failed with an exception.
androidxが足らないので入れる。
$ cordova plugin add cordova-plugin-androidx
package android.support.v4.content does not existエラーが出るとき
> Task :app:compileDebugJavaWithJavac FAILED /tmp/download/platforms/android/app/src/main/java/mobi/monaca/plugins/debugger/api/BaseSseConnection.java:5: error: package android.support.v4.content does not exist import android.support.v4.content.LocalBroadcastManager;
androidx-adapterが足らないので入れる。
$ cordova plugin add cordova-plugin-androidx-adapter
cordova-plugin-consentが含まれないとエラーが出る場合
monaca-admobplusのandoridでアプリは、作成されたが、アプリを開いた際に、以下のようにメッセージが出る場合。GDPR(EU一般データ保護規則)のプラグインが無いので入れる。
cordova-plugin-consent
直し方
$ cordova plugin add cordova-plugin-consent
参考:https://admob-plus.github.io/docs/installation.html
変更がアプリに反映されないとき
アプリがビルド出力された後、monacaのアカウントを別のアカウントで入ってないか確認する。
iOSエラー
AMSBanner.swiftがThe following build commands failedというエラーが出たとき
** ARCHIVE FAILED ** The following build commands failed: CompileSwift normal armv7 /tmp/download/platforms/ios/admobplus/Plugins/cordova-admob-plus/AMSBanner.swift CompileSwift normal armv7 /tmp/download/platforms/ios/admobplus/Plugins/cordova-admob-plus/AMSInterstitial.swift CompileSwift normal armv7 /tmp/download/platforms/ios/admobplus/Plugins/cordova-admob-plus/AMSPlugin.swift CompileSwift normal armv7 /tmp/download/platforms/ios/admobplus/Plugins/cordova-admob-plus/AMSRewardVideo.swift CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler CompileSwift normal arm64 /tmp/download/platforms/ios/admobplus/Plugins/cordova-admob-plus/AMSBanner.swift (6 failures) xcodebuild: Command failed with exit code 65
plugins/cordova-admob-plus/src/ios/AMSBanner.swift の中の以下部分を修正する
修正前
view.sendSubviewToBack(background)
修正後
view.sendSubview(toBack: background)
一応このエラーは消えた。
参考:https://github.com/admob-plus/admob-plus/issues/96
PhaseScriptExecutionエラーが出るとき
PhaseScriptExecution [CP]\ Copy\ Pods\ Resources /Users/builder/Library/Developer/Xcode/DerivedData/admobplus-azmnuofsrizxppbftnepxjnvvpwj/Build/Intermediates.noindex/ArchiveIntermediates/admobplus/IntermediateBuildFilesPath/admobplus.build/Debug-iphoneos/admobplus.build/Script-A588BB76815524C1F3DFDB5F.sh (1 failure) error: Resource "/Users/builder/Library/Developer/Xcode/DerivedData/admobplus-azmnuofsrizxppbftnepxjnvvpwj/Build/Intermediates.noindex/ArchiveIntermediates/admobplus/BuildProductsPath/Debug-iphoneos/PersonalizedAdConsent/PersonalizedAdConsent.bundle" not found. Run 'pod install' to update the copy resources script.
以下を実行
cordova plugin add cordova-plugin-firebasex@8.0.1
したけど、以下依存エラーになったので、だめかも。
Version of installed plugin: "cordova-plugin-androidx@2.0.0" does not satisfy dependency plugin requirement "cordova-plugin-androidx@^1.0.2". Try --force to use installed plugin as dependency.
参考:https://github.com/dpa99c/cordova-plugin-firebasex/issues/326
結論:これ出たら最初からやり直してみる、androidx側のプラグインを入れずに、やるとでなくなった。(android側も確認してくとまずいかもだけど・・)
最終結論:cordova plugin rm cordova-plugin-consent でプラグインを消すとよい。
iOSでビルドがどうしてもできなかったとき
ビルドできた手順
- https://github.com/admob-plus/admob-plus のzipをimport
- cordova plugin add cordova-admob-plus --variable APP_ID_ANDROID=ca-app-pub-3940256099942544~3347511713 --variable APP_ID_IOS=ca-app-pub-3940256099942544~1458002511
- plugins/cordova-admob-plus/src/ios/AMSBanner.swiftの "view.sendSubviewToBack(background)"部分を "view.sendSubview(toBack: background)"に書き換える
- これでiOSアプリをビルドする(以降ビルドは不要で、htmlやjsの変更はビルドしなくてもデバッグ時は適用される)
- cp examples/basic/www/js/index.js www/js/ をコピーしてくる。
- 上記www/index.htmlをコピーしてくる。
バナー、インステ、リワードともに再生できた。
この後、androidx入れてiosビルドしても、iosビルドに失敗しなかった。
cordova plugin add cordova-plugin-androidx cordova plugin add cordova-plugin-androidx-adapter
以下を入れると・・・
cordova plugin add cordova-plugin-consent
以下エラーとなった・・。
The following build commands failed: PhaseScriptExecution [CP]\ Copy\ Pods\ Resources /Users/builder/Library/Developer/Xcode/DerivedData/admobplus-azmnuofsrizxppbftnepxjnvvpwj/Build/Intermediates.noindex/ArchiveIntermediates/admobplus/IntermediateBuildFilesPath/admobplus.build/Debug- iphoneos/admobplus.build/Script-F5A83C26125D7FDCAA9D8A14.sh (1 failure) xcodebuild: Command failed with exit code 65
以下 コマンドで cordova-plugin-consentを削除すると上記ビルド時のエラーが消えた。(管理画面でcordova-plugin-consentを消してもだめでした)
cordova plugin rm cordova-plugin-consent
AppId変更
package.jsonのadmobの部分を変更
"cordova": { "plugins": { "cordova-custom-config": {}, "cordova-admob-plus": { "APP_ID_ANDROID": "ca-app-pub-3940256099942544~3347511713", "APP_ID_IOS": "ca-app-pub-3940256099942544~1458002511" }, "cordova-plugin-androidx": {}, "cordova-plugin-androidx-adapter": {} } },
iosでjs変更後広告が出ないことがある
- ビルドの必要のないhtmlやjsの変更直後だと広告が出ない事がある。
- 一旦アプリを落として、再度開くと出る。(iosのbannerで起こった。フリークエンシーキャップがそういう挙動なのか・・・)