ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2015年09月25日

[iOS] ADMob SDK 6->7系への更新注意点色々

ADMob SDK 6->7 へのアップデートをなんとか終えたので、ひっかかった点をメモ。
xcodeは7.0。cocoaPodsは 0.39.0.beta.4

とりあえず、当然だけどpod installする前に、ワークスペースをまるごとzipしていつでもまるごと復元できるようにしといたほうがいい。これは絶対。
サンプルみたいなほんとうに簡単なプロジェクトならともかく、何年もメンテしてきてあれこれ大人の事情だらけになったワークスペースに、知識なしでかけるとかなりの確率で失敗すると思う。

まずcocoaPodsについては以前の記事を参照。

pod installして、XXX.xcworkspaceをxcodeで開き、
@import GoogleMobileAds;
すると、まずエラー。

disable @importとかなんとか。
これは、Build settings。allにして、Apple LLVM 7.0 Language - Modulesのセクション、
CLANG_ENABLE_MODULES
をYESにする。

それでこのエラーは消えるんだけど、うちの場合Objective-CじゃなくてObjective-C++のコードがほとんど。
色々試したんだけど、今の所@import をObjective-C++で通す方法は見つけられていない。
仕方ないんで、Objective-Cで書いたViewでWrapする。

それで通るかっていうと、まだわからない。今回の対象プロジェクトは1つのワークスペースに3つのプロジェクトがあって、定義によって有料版、無料版、派生版を生成するものだった。
で、pod installでうまいこと書き換えてくれるのは、どういうわけか最初のプロジェクトだけ。
ADMobは広告なんで、無料版のプロジェクトを書き換えてくれないといけないわけだけど、もちろんそんなことを考えてプロジェクトは並べていない。
最初は全部が書き換えられたのだと思ってたので、@importでGoogleMobileAdsがどうしてもNot foundになる地獄を2日ほど味わわされた。
cocoaPodsが書き換えるプロジェクトは先頭1つだけ。
どれが書き換えられたかは、
ProjectのBuild Settingsの横方向への見出し項目で

Resolved - (プロジェクト名) - Config.File.. - (ワークスペース名)
となってたら書き換えられてる。
書き換えられてないProjectはこの Config.File.. の部分がない。
これで違うところを書き換えられてしまったのをうまくどうにかできる方法があるかもしれないが、いかにも事故りそうなので、この場合はやり直した方が無難。
バックアップからワークスペースを復元し、manage schemeで順番を変え、対象にしたいプロジェクトを先頭にもってくる。これでpod installの対象を変更できる。

あと、pod installしたときにメッセージが色々出るので、[!]と色のついてるやつだけでもちゃんと読んで従うこと。

うちの場合はこんな感じだった。
[!] Please close any current Xcode sessions and use `XXX.xcworkspace` for this project from now on.
Sending stats

[!] The `XXXXXX [Debug]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods/Pods.debug.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.

[!] The `XXXXXX [Release]` target overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.

[!] The `XXXXX [Release]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.

例えば最後のはOTHER_LDFLAGSの項目に$(inherited)がないから付けろ!といってるっぽい。

それでうちの場合は(対象OSの下限が低すぎるとかのエラーも出たがそれはまぁどっちにしろもう変えないといけないんで)なんとか通るようになった。

次はリンクでエラー。これは前の記事にあったBITCODE。ADMobのSDKは7.5でもBITCODEがないそうだ。
そもそもBITCODEって何?っていうと、なんかバイナリの中間コード?みたいなもので、CPUのアーキテクチャが変わっても誰かがなんとかうまいことやってくれるものらしい、ってのを読んだ。Apple Watchが意識されてる?よくわかんないけど。
というわけで前の記事通りBuild SettingsでBITCODEなくてもいい設定にする。
(Build Optionsセクション ENABLE_BITCODE -> NO )

やれやれ終わりか、というとまだ。

今度はArchiveができない。これができないと審査に出せない。
これについては、プロジェクトのFrameworkフォルダ内のlibPods.aが赤くなってる(見つからない)のが原因なんだそうだ。

それでこれを解消するための手順がlibPods.a 赤 とかでググるとあちこちで見つかる。

例えば
libPods.a が赤字になっているときにやること

で手順が丁寧にかかれてる。

ここに書かれてる通り、ちゃんとやれば問題ないのだが...
自分のようなせっかちうっかりの人間は斜め読みでやってはまる。

Podsのビルドをするとき、対象が必ず"iOS Device"であること(実機が繋がっててもいいのかも)。
なぜかシミュレータではうまくいかなった。
なおかつ、これでビルドしてもまだ赤くならない。なぜか本体のビルドをして、しかもあれこれやってると何が効いたのかlibPods.aが黒くなる。何度もは試せないので、因果関係が特定できない。
xcode7で振る舞いが変わったのかもしれないけど。

これでArchiveができるようになった。

全体の中で何が一番の罠だったかって、それはpod installの対象が先頭プロジェクトのみだったこと。
Stack Overflowとかでも@importしたModuleがどうしてもnot foundで、いろんなこと返答があってもことごとく効かないってのがたまに見かけたけど、ひょっとしてこれなんじゃないだろうか。
ワークスペース内のプロジェクトの数までは話してなかったから、質問者は複数あって当然、返答は1つしかなくて当然のスタンスでやりあったら絶対答えはわからないから。

まだまだなんかあったような気がするので思い出したら加筆する。

@@便利にするという金看板で、不完全な技術で更新を迫りコンテンツと関係ない仕事を却って増やすことがあまりに多すぎる。
従来の資産を更新するのが一番困難になりつつある昨今、コードを短くして作り込まず更新はしないでプロジェクトごと使い捨てていくスタイルが最も時代に適しているように感じてしまう。
それだとソースやライブラリの管理など無意味になってcocoaPodsなどの存在価値もなくなってしまう気がするのは皮肉なことだ。
それに対応できない自分がロートルなんだ‥と、それだけかもしれないが。
タグ:iOS AdMob
posted by みこあいさ at 11:29| iOS開発