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


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開発

2015年09月19日

[iOS] iOS9 日本語環境の判断コードの変更が必要に [NSLocale preferredLanguages]

iOS9でぜーったいなにか起こる‥と思って今日やっとテストしてみたら‥やっぱり‥

日本語が出るべき時にでない。

デバッガで調べてみると、日本語判断に失敗している。

[NSLocale preferredLanguages];
NSArray *languages = [NSLocale preferredLanguages];
NSString *currentLanguage = [languages objectAtIndex:0];

if( [currentLanguage isEqual:@"ja"] ){
isJapan = true;
}
みたいなコードがあちこちにあるので使ってる人も多いと思うのだけど、これのcurrentLanguageが
"ja" から "ja-JP"になってる。
さらにこの件で調べると、前のほうがLanguage、後ろのほうがRegionになっているので
ja-USとかもありうるようになったということらしい。

if (
[currentLanguage isEqualToString:@"ja"] || // iOS8以前
[currentLanguage hasPrefix:@"ja-"]) { // iOS9 対応

isJapan = true;
}

に変更したいほうがよさそう。
単に
if( [currentLanguage hasPrefix:@"ja" )
でもよさそうだけど、一応jaで始まる3文字以上の何かの文字で間違わないようにって感じか。
言語コードで3文字ってあったかなって気もするけど。

しかしこの変更は地味だけどうちのほとんどのアプリが影響を受ける。
どうしてこういうところを互換性ない仕様に変えるかな‥

アプリの更新はいいけど、アプリ更新するとやっと集まった星が全部没収になる仕様なんで嫌になる。
なんでこんな仕様なんだろうapp store。

@2015.9.20 追記
その後の調査で判明:

プレビューβ版のときから指摘されていて、いくらなんでも影響を受けるアプリが多いだろうためGMでは修正されるんじゃないかとの観測もあったにも関わらず、Appleはこの仕様をつっきった模様。
この仕様はリリースノートに載ってないという発言も目にした(実際には未確認)。

その結果、同様の問題を起こすアプリが続出している。Twitterアプリなどが大きめなところ。ゲームの接続サーバーが英語になったとか、そんな結構大きい影響が出ている。

iOS9アップデートすると多くのアプリが英語に!混乱まとめ

影響されるアプリが相当数になる為、他にも出ているバグフィクスと一緒に変更される可能性も多少はあるかもしれない。

なんにせよ、特に目的の機能があるとかでないかぎり、テスト以外の目的で通常のユーザーが”なんとなく”で現在のiOS9にアップデートするのは無用のリスクを背負う以外のなにものでもなさそう。
タグ:iOS ios9
posted by みこあいさ at 11:57| iOS開発

2015年09月17日

[iOS] xcode7 : リンカーがエラー / ライブラリ.o does not contain bitcode.

前の記事のxcode7 になったらADmobの6系が通らなくなったって内容だけど、cocoaPodsを使ってADMob SDK 7.4.1つうのを入れてビルドしてみても改善されなかった。

リンカーのエラーを見ると6系のときと同じで、なんかbitcodeとかいうのがないとかなんとか。
ld: '/Users/XXX/Documents/XCodeProjects/XXXXX/Pods/Google-Mobile-Ads-SDK/GoogleMobileAdsSdkiOS-7.4.1/GoogleMobileAds.framework/GoogleMobileAds(GADGestureIdUtil.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

それでこのbitcode問題を調べてみるとやはりxcode7で出るようで、回避方法はBuild Settingsのほうの設定変更だった。

手順としては、 Project / TARGET / Build Settings で All (Basicでは非表示)にすると Build Options セクションに ENABLE_BITCODEという欄があって、これがYesになってる。これをNoに変える。

ADMob SDK 6 系でもこの変更だけで通るかもしれない。通る可能性が濃厚。だが試していない。
(その後この設定変更だけで通ることを確認した @2015.9.20追記)

それはADMob 6 系のSDKの入ってたProjectにADMob 7 をpod installして、古いADMobのライブラリを削除したらそれだけで通っちゃったから。
なんでそうなるの?って感はあるのだけど、まあいいか。

とりあえず懸念事項について一つ道筋が見えた。
タグ:iOS Xcode xcode7
posted by みこあいさ at 11:19| iOS開発