2020-06-19に更新

GodotでAdMobを使う - iOSの場合

GodotでiOSアプリにAdMobを表示する方法。Androidの場合は下記。

GodotでAdMobを使う - Androidの場合

実際にやったのはGodot3.2。Androidの場合とは違い、iOSの場合は自分でGodotのテンプレートをビルドしなければならないのでちょっと面倒くさい。

AdMobモジュールの取得

AdMobモジュールは下記。まずは下記のリポジトリをcloneしておく。

https://github.com/kloder-games/godot-admob

基本的にやり方はこのREADMEに書かれている。そちらの How to use の iOS というところ。この話の前提として、Godotのリポジトリと組み合わせてビルドが必要なため、こちらもcloneしておく必要がある。

https://github.com/godotengine/godot

AdMobモジュールをGodot側にコピーする

まずはgodot-admobリポジトリのadmobフォルダを、godotリポジトリのmodulesフォルダにコピーする。

Google Mobile Ads SDKを配置する(新)

2020/6にUIWebViewを含めたビルドではアップロードできなくなったため最新のSDKを利用できるようになった。README通りにやればよい(僕が書いてPR送った)。下記のファイルを admob/ios/lib に配置する。 put_GoogleMobileAds_framework_here のようなファイルがあるのでわかりやすい。

  • GoogleMobileAds.framework
  • GoogleAppMeasurement.framework
  • GoogleUtilities.xcframework
  • PromisesObjC.xcframework
  • nanopb.xcframework

Google Mobile Ads SDKを配置する(旧)

追記)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をビルドする

これで準備ができたので、godotプロジェクト側をビルドする。詳しくはREADMEに貼られている下記リンクの通り。

http://docs.godotengine.org/en/stable/development/compiling/compiling_for_ios.html

sconsをインストールしてビルド

ビルドにはSConsというビルドツールを利用する。これはbrewでインストールできる。

brew install scons

ビルド方法は書かれている通り、下記の必要な方。

開発用

scons p=iphone target=debug

リリース用

scons p=iphone target=release

他にも、エミュレータ用や別のアーキテクチャの組み合わせなど、色々指定もできるためそれは必要であれば前述のリンクの解説を参考に。僕は上記の2つだけでやった。

これでbinフォルダにaファイルが出来上がるので、これをXcodeプロジェクト側のトップにあるaファイルと差し替えれば完成。

エラーが出たパターン1

ちなみに下記のようなエラーが出る場合があった。

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

エラーが出たパターン2

下記のようなエラーが出た。

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を見て、改善していれば最新に、不具合発生の真っ最中であればちょっとコミットを戻してみたりして調整したりしなければならない。かなり面倒くさい。僕も何ヶ月も放置していてようやく対処できた。

Xcodeの設定

さきほどの5つのフレームワークをXcodeプロジェクト側にも追加する必要がある。Xcodeを開いたプロジェクトの中に参照で登録する。frameworkの読み込みパス設定に配置したフォルダの設定を追加する必要がある。xcframeworkの場合は直接Xcodeに登録するのではなく、中のios-armv7_arm64以下等にframeworkフォルダがあるのでそちらを利用する。パスの設定もそこ。

Godot側のコード

一応実際のコード。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のリンクエラー

ずっとarmv7のリンクエラーが出ていて断念していた時期があるのだが、Godotエディタ側の設定にアーキテクチャの選択があるので、Xcodeプロジェクトをエクスポートする前にそれでarmv7を外しておいたほうが良いかもしれない。このあたりハマると非常に面倒。(これはAdMobすら関係なかったかもしれないが一応メモ)

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント