のらぬこの日常を描く

ノージャンルのお役立ち情報やアニメとゲームの話、ソフトウェア開発に関する話などを中心としたブログです。

この怨み、地獄へ流します・・・ ~ iOSアプリ審査提出前のバリデーションフェーズで起きた悲劇を語る

どうも、のらぬこです。

完成したiOSバイス向けのアプリをAppStoreで配信するには、林檎神の理不尽な審査を通過しなければならない。

xcodeで成果物を提出するための操作を行うと、まずはプロジェクト関連ファイルのバリデーションが実行される。

この段階で、例えば「アイコンのサイズが規定のサイズでキチンと作られているか」とか「そもそもちゃんとビルド通るか」等が確認される。

今回は、このプロジェクトコード一式のバリデーションで発生したエラーではまった話をしようと思う。

f:id:noranuk0:20170712131641p:plain

ITMS-90056

This Bundle ****/TabPageViewController.framework is invalid Thr Info.plist file is missing the required key: CFBundleVersion

内部で利用している「TabPageViewController」というフレームワークのInfo.plistがおかしい?必須項目であるCFBundleVersionというキーが存在しないというエラーのようだ。

軽く調べてみたが結局原因は不明のまま。TabPageViewControllerの取り込み方法をcarthageからcocoaPodに変更することで回避できた。

ITMS-90328

Your package contains a file Main.storyboadc/TabPageView.nib with a name that contains invalid characters. Avoid using control characters in the file names.

なんとなく翻訳してみると、「ファイル名に使っちゃいけない文字を使っている」と書かれているような気がする。だが、対象のファイルは “TabPageView.nib” と、使っちゃいけない文字とか全くなさげ。

解決編

原因と修正方法を先に書いてしまう。

まず原因の方だが、このエラーは、ストーリーボードに配置されたViewContorollerのstoryboardIDに変な文字(改行とかタブとかファイル名としてあまりよろしくない文字)が紛れ込んでいた場合に表示される。

ちなみに、そのIDがプログラムから全く参照されていない場合、リリース用にcode validationを掛けるまで「警告」「エラー」等は何も表示されないし、シミュレータや実機などで開発版を動かす際も特に不具合は発生しない。

したがって、原因や修正方法に関する知見を持たないままプロジェクトが最終局面を迎えてしまうと、最後の最後になって初めてこのエラーを目にすることとなる*1

さて、次は修正方法だが、まずはプロジェクトに登録された全てのstoryboardファイル内を「」で検索してみるとよい。

もし、見つからなかった場合は、このブログ記事の内容を読んでも解決策は見つからないと思うので、早々に立ち去って他の記事を探すことをオススメする。

見つかった場合、見つかった箇所周辺のxmlタグを眺めつつ、対象のViewControllerなどを特定し、storyBoardIdなどに特殊文字が紛れ込んでいないかを確認してみようか。

ただしここで注意していただきたいのは、xcodeのプロパティービューを見ても特におかしなところは見当たらない(ように見える)かもしれないことだ。

だがしかし

storyboardId欄などにフォーカスし、ctrl+A → ctrl+Cなどで全選択コピーをして、そのまま他のエディターなどに貼り付けてみると、たしかに妙な文字(僕の場合は)が紛れ込んでいるのである。

最も、とりあえず場所が特定できれば後はどうということはない。問題箇所を適切に修正すれば、このエラーは消えるはず。

調査編

修正は一瞬だったが原因の特定にはそれなりに苦労したので、せっかくだから修正完了までの作業プロセスも書いておく。

まずは、nibファイルが何物なのかと思って調べてみた。検索結果を流し読みしただけなのだが、どうやら画面レイアウト系のファイルのようで、アーカイブ時にstoryboardから生成されるファイルらしい。

そういえばstoryboardファイルの中身ってxmlなので、とりあえずテキストとして開いて TabPageView で検索してみるが、対象の文字列は見つからず。

次に、エラーコードやエラーメッセージ等で検索してみるも、xcode再起動してもう一度試してみれば?的なアドバイスはどこかにあった。一応やってみたけど当然ダメ。

とりあえず、TabPageView.nibというファイルを探してみることにした。

といっても、xcodeがビルドする際に中間ファイル的なものをどこに作るのかわからなかったので、以下のコマンドで対象ファイルっぽいものを探してみる。

$ find / --name TabPageView.nib 2>/dev/null 
/private/var/folders/...../Base.lproj/Main.storyboardcTabPageView.nib

発見。

見つかったディレクトリに移動して lsしてみる。

$ ls -la
total 432
-rw-r--r--   1 * * 7 10 13:08 ?TabPageView.nib
drwxr-xr-x  40 * * 7 10 13:08 .
drwxr-xr-x   4 * * 7 10 13:08 ..
...
...

「何かおかしい」

確かに、ファイル名先頭に不穏な文字がくっついている。

$ cat <TAB>
^HTabPageView.nib

H」を文字コードに直すと「0x08」。

「お前、タブ文字か・・・・」

そこで、ふと気づき、Main.storyboardを一旦カラにし、素のViewControllerを一つ配置した状態で再Validationをかけてみる

言うまでもなく、当然起動直後にクラッシュするとは思うが、少なくともValidationは通った。

storyboardをもとに戻し、配置されているViewControllerを1つずつ削除しながら、どのViewControllerを削除したときにValidationが通らなくなるかを確認しつつ、問題となっているViewControllerを特定する。

特定ができれば、あとは対象のViewControllerがxmlのどこに配置されているかを確認し、xmlの対象箇所を凝視して何かおかしそうな場所がないかを確認すればいい。

原因が特定できればあとは修正するだけだ。

上の「解決編」で書かれたことを実践し、問題を修正。その後、再度バリデーションをかければ、少なくとこのエラーは消えているはずだ。

最後に

エラーの原因解りづらいわ、そもそもxcodeがエラー箇所を正しく指摘してくれないわ、「ファイル名にコントロールコードが含まれてるからダメ」とかエラーコードまで定義されてる割にバッグ実行の為のビルドは成功するし、シミュレータ実機デバッグ共に問題なし何だが?

UXのなんたるかについて、Microsoft VisualStudio開発チームあたりから一世紀ほど学んでから出直してきてほしい。

取り敢えず彼らには、不幸の手紙と藁人形と五寸釘10セット程を是非とも寄贈して差し上げたいと思った次第。

ワラ人形(藁人形)セット

ワラ人形(藁人形)セット

今回の記事は以上だ。

*1:僕のように