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


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

2015年11月11日

[iOS]xcode7になってからindexingが異様に重い/iCoreServiceのCPU負荷が200%を超える

表題のとおり。
xcode7になってからindexingが異様に重くなって、ヘッダをちょっとでもいじろうものなら文字入力が苦痛になるほどになってしまった。
使ってるのが2011のMBAなんで、さすがにもう無理かとSkylake iMac買い替えも真面目に検討したけども、一応現状で対策できたっぽいので記録。

まずiCoreServiceってのがなんなのかっていうと、これはウイルスバスターのスキャンプログラム。不思議なことにxcode6まではそんなことなかったのに、なぜかxcode7になってからindexingが走ると同時に動き始めて、しかも恐ろしく重く(CPU 200%-300%くらいまでいく)結果開発効率を激しく落としてくれる。
indexingを止めるのも一案だけども、それをすると関数の引数の予測補完とか、デバッグのときの変数値が表示できなくなったりなど昨今のIDEとして致命的なほどの機能低下を招く。

対応策としては、ウイルスバスターの設定でスキャンの例外を設定する。例外フォルダにxcode.appのあるところを指定したら、indexingで走らなくなった。

ただまだ普通のビルドでは走ってしまうので、それも止められないものかとトライ中。書類/ 下のXcodeProjects/ を例外にするのではダメだった。

それとxcodeとは関係なく、ウイルスバスターの予約検索を切った。リアルタイムスキャンという水際防御ができてるならそれはいらないかと。でもパターンファイルの更新タイミングとかですり抜けるものもあるかもしれないから時々意識的スキャンをやってやる必要があるかもしれない。

以前のChromeにトレンドマイクロツールバーを入れたらcode吐きまくりだったこととか、どうもウイルスバスターのMac版は手抜き感が否めない。まあ実際昔買ったwin版更新したらおまけで使えるようになっただけだし。主力となってる以上もっといいものがあれば乗り換えるべきだと思った。
posted by みこあいさ at 11:38| iOS開発

2015年10月02日

[iOS]In App Purchaseがあるアプリのアップデート&テスト

iOSの更新はとにかく実質的で無い仕事を増やしてくれて辛すぎる。
いい加減アプリ本体を書かせて欲しい。
iOS9もだけど、なんかiOS6が地味に最後の方で変な更新をしたらしく、OpenGL周りで正体不明の落ちるバグが出てる。Stack overflowとかで苦しんでる人達の話を見る限りこれといった解決策なし。
ちなみにsgxTextureGetImageRowBytesの中で EXC_BAD_ACCESSとなる。
自分の場合、FrameBufferを作ったりサイズを変えたあと間髪入れずに描くと飛ぶらしかったので少しだけ遅延させたらとりあえず止まった。これでいいのかは知らんが。iOS6なんて捨てろよ、というAppleからの圧力か。
というか、iOS6,7,8,9とちょっと範囲広すぎ。対して年数たってないのに。個人でこれだけのOSバージョンの実機をいつでも使える状態で保持しておくことがかなりの苦行。

おっと脱線。In App Purchaseのテストの話。

iOS9で起きたアプリの問題を順次修正しているのだが、ずいぶん更新していなかったアプリのIn App Purchaseでひっかかったのでメモ。

In App Purchaseのチェックで、プロダクトのリストアをしようとした。
AppleID に passwordを入力すると、 "入力された apple id が存在しないか、またはパスワードが正しくありません。"
あれ?password間違えたかな?と何度やっても同じ。おかしいので、一旦削除して、App Storeから現在公開中のバージョンをダウンロードしてきてテスト。問題なし。

とにかくしばらくぶりなんで、SDKのせいとか、xcodeのせいとか色々考えたけど、結局アップデートの時も開発時はSandBoxでやらないとダメってことらしい。あれそうだったっけ?もう思い出せない。

それで、iTunes connectでSandBoxテスターを作って、設定から今のAppleIDサインアウトして、SandBoxテスターでサインイン...とやったらSandBoxテスターなのに規約に同意やらクレカの入力やら...辛すぎる。
‥とこれも忘れてたんだけど、SandBoxテスターはここでサインインしちゃだめだったんだよね。
何もAppleIDでサインインしてない状態で、ガツンとIn App Purchaseの購入(リストア)にいくと、既存のAppleIDを使う?新しいの作る?とか聞いてくるダイアログが開くから、それに既存のAppleIDとしてSandBoxテスターのAppleIDとpwをいれてやればいい。

ごちゃごちゃ約束ごと多すぎで、何年に1ぺんしか更新しないアプリに必要な情報なんてとても覚えていられないよ。
タグ:iOS
posted by みこあいさ at 12:47| iOS開発

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