GodotでiOSアプリにAdMobを表示する方法。Androidの場合は下記。
実際にやったのはGodot3.2。Androidの場合とは違い、iOSの場合は自分でGodotのテンプレートをビルドしなければならないのでちょっと面倒くさい。
AdMobモジュールは下記。まずは下記のリポジトリをcloneしておく。
https://github.com/kloder-games/godot-admob
基本的にやり方はこのREADMEに書かれている。そちらの How to use の iOS というところ。この話の前提として、Godotのリポジトリと組み合わせてビルドが必要なため、こちらもcloneしておく必要がある。
https://github.com/godotengine/godot
まずはgodot-admobリポジトリのadmobフォルダを、godotリポジトリのmodulesフォルダにコピーする。
2020/6にUIWebViewを含めたビルドではアップロードできなくなったため最新のSDKを利用できるようになった。README通りにやればよい(僕が書いてPR送った)。下記のファイルを admob/ios/lib
に配置する。 put_GoogleMobileAds_framework_here
のようなファイルがあるのでわかりやすい。
追記)UIWebView排除のため、既に最新のSDKを使えるようになっているため最新バージョンではこれは不要。(追記終わり)
次に公式のGoogle Mobile Ads SDKを配置する。現時点でのバージョン指定は7.41.0以下。ちなみにこのバージョンはもう公式ではダウンロードできないので、CocoaPodsを利用して取得した。
platform :ios, '9.0'
pod 'Google-Mobile-Ads-SDK', '7.41.0'
上記のPodfileを作って pod install
。
admob/ios/lib
に配置しろと書かれているが、これは先程godot側にコピーした方のフォルダ。godot側でビルドして使うため。put_GoogleMobileAds_framework_here
と書かれたフォルダがあるので、そこにGoogleMobileAds.frameworkフォルダをコピーしてくる。
これで準備ができたので、godotプロジェクト側をビルドする。詳しくはREADMEに貼られている下記リンクの通り。
http://docs.godotengine.org/en/stable/development/compiling/compiling_for_ios.html
ビルドにはSConsというビルドツールを利用する。これはbrewでインストールできる。
brew install scons
ビルド方法は書かれている通り、下記の必要な方。
開発用
scons p=iphone target=debug
リリース用
scons p=iphone target=release
他にも、エミュレータ用や別のアーキテクチャの組み合わせなど、色々指定もできるためそれは必要であれば前述のリンクの解説を参考に。僕は上記の2つだけでやった。
これでbinフォルダにaファイルが出来上がるので、これをXcodeプロジェクト側のトップにあるaファイルと差し替えれば完成。
ちなみに下記のようなエラーが出る場合があった。
scons: Reading SConscript files ...
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: unable to lookup item 'Path' in SDK 'iphoneos'
Failed to find SDK path while running xcrun --sdk iphoneos --show-sdk-path.
よくは分からないけど下記で改善できた。GitHubの方はいいねがいっぱいついてるコメントあたり。
https://qiita.com/shouta-dev/items/a8e4914ec4d88cffac10
https://github.com/facebook/react-native/issues/18408
下記のようなエラーが出た。
scons: Reading SConscript files ...
Checking for C header file mntent.h... (cached) no
scons: done reading SConscript files.
scons: Building targets ...
[Initial build] Compiling ==> platform/iphone/godot_iphone.cpp
In file included from platform/iphone/godot_iphone.cpp:33:
platform/iphone/os_iphone.h:84:2: error: unknown type name 'VideoMode' [2]
VideoMode video_mode;
^
platform/iphone/os_iphone.h:92:33: error: unknown type name 'VideoMode' [2]
virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
^
platform/iphone/os_iphone.h:122:2: error: unknown type name 'InputDefault' [2]
InputDefault *input;
^
platform/iphone/os_iphone.h:149:48: error: use of undeclared identifier 'InputDefault' [2]
void joy_axis(int p_device, int p_axis, const InputDefault::JoyAxis &p_value);
^
platform/iphone/os_iphone.h:166:36: error: unknown type name 'VideoMode' [2]
virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0);
^
platform/iphone/os_iphone.h:167:10: error: unknown type name 'VideoMode' [2]
virtual VideoMode get_video_mode(int p_screen = 0) const;
^
platform/iphone/os_iphone.h:168:45: error: use of undeclared identifier 'VideoMode' [2]
virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const;
^
7 errors generated.
scons: *** [platform/iphone/godot_iphone.iphone.opt.arm64.o] Error 1
scons: building terminated because of errors.
Godot3.2にし、godotもgodot-admobも最新にしたらビルドできるようになった。
他にも、iOSの場合はgodot-admobの不具合が原因でだめな場合があった。2020/4月末あたりに解決のPRがマージされたので、それ以降はうまく行った。とにかくうまく行かない場合はissueを見て、改善していれば最新に、不具合発生の真っ最中であればちょっとコミットを戻してみたりして調整したりしなければならない。かなり面倒くさい。僕も何ヶ月も放置していてようやく対処できた。
さきほどの5つのフレームワークをXcodeプロジェクト側にも追加する必要がある。Xcodeを開いたプロジェクトの中に参照で登録する。frameworkの読み込みパス設定に配置したフォルダの設定を追加する必要がある。xcframeworkの場合は直接Xcodeに登録するのではなく、中のios-armv7_arm64以下等にframeworkフォルダがあるのでそちらを利用する。パスの設定もそこ。
一応実際のコード。initのところでisRealを指定してあるので、デバッグのテスト広告コードを指定している部分は不要かもしれない。
if Engine.has_singleton("AdMob"):
admob = Engine.get_singleton("AdMob")
if OS.get_name() == 'iOS':
# 一般向け(if文とは関係ない)
admob.init(!OS.is_debug_build(), get_instance_id())
else:
# 子ども向けの例(if文とは関係ない)
admob.initWithContentRating(!OS.is_debug_build(), get_instance_id(), true, 'G')
if OS.is_debug_build():
admob.loadBanner('ca-app-pub-3940256099942544/6300978111', false)
else:
if OS.get_name() == 'iOS':
admob.loadBanner('iOS用の本番コード', false)
else:
admob.loadBanner('Android用の本番コード', false)
ずっとarmv7のリンクエラーが出ていて断念していた時期があるのだが、Godotエディタ側の設定にアーキテクチャの選択があるので、Xcodeプロジェクトをエクスポートする前にそれでarmv7を外しておいたほうが良いかもしれない。このあたりハマると非常に面倒。(これはAdMobすら関係なかったかもしれないが一応メモ)
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント