リジェクトされたアプリを修正してドツボにハマった

前回、リジェクトの理由が分かったので、チャチャっと修正するつもりでいましたが、

世の中そんなに甘くはありませんでした。

結論から言うと、ハマった理由は自分のマヌケなミスが原因でした。ビルド後に、プロジェクトを入れていたフォルダの階層を変えてしまったのです。
今回の初アプリを入れていた「myProject」は、「LearningXcode」というXcode学習的な名前のフォルダ下に置いてました。ビルド後に落ち着いたところで、「もはや、学習ではない」という考えから、自分の変な性格が余計なところで出てしまった愚行です。
プロジェクトが入ったフォルダの場所を変えても、何の問題もなくプロジェクトを開くことは出来ます。ここに落とし穴がありました。

どんな風にドツボにハマって行ったかと言うと、、、。
まず、リジェクト対策の修正を施し、エミュレータで動作を確認、一応実機も確認しようとRUNしました。
その時に、
Could not launch XXXX.appError launching remote program: No such file or directory(/Users/XXX/Library/Developer/Xcode/DerivedData/XXXX-XXXXXXXXXXXXXXXXXXXXXXXX/Build/Products/Release-iphoneos/XXXX.app/XXXX).
というエラーが出ました。
そのエラーを見て、「これはビルドした状態のままだからエラーが出るんだ」と勝手に思い込み、Edit schemeのRUN XXXX DebugのBuild ConfigurationをReleaseからDebugに変えてRUNしてみました。
すると、今度はエラーが出なくなったものの、No issueでコンパイル通った後に、実機だけにSIGABRTが出るようになってしまいました。またもや、SIGABRTです!
ググッてイロイロ調べたものの、見つかるのは「実機とMacを再起動したら直った!」的な解決策ばかり。もちろん再起動も試しましたが、直りません。
で、気が付いたのが、Xcode画面右下のエラーメッセージ。
2012-09-11 14:32:30.651 XXXX[9975:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/XXXX-XXXX-XXXX-XXXX-XXXX/XXXX.app> (loaded)' with name 'acViewController''*** First throw call stack:....
「acViewControllerなんて無い」と申しておる。。。

でも、import関係は大丈夫だし、文字ミスも検索で調べて問題ないし、そもそもビルド後にいじってません。

そこで私は何を思ったのか、「Edit schemeのRUN XXXX DebugのExecutableが『XXXX.app』になってるから、各クラスが入ってないのでは?」という発想になり、Executableの対象を変更しようとファイルリクエスタを開きました。何しろ、ビルド後初めての修正なので全く勝手が分からず、どんどん深みにハマって行きます。
開かれたフォルダの上下階層を何とな~く見ていると、コンパイルされたと思われるプロジェクトのフォルダがズラリと並んでいるフォルダを見つけました。

場所は、ユーザー/ライブラリ/Developer/Xcode/DerivedData/下です。普通に開いたFinderでは行けなかったのですが、Finderの左上にある「パス」というボタンで、ユーザー名からたどって行けました(パスというボタンが無い場合は、Finderの空いてる部分を右クリックして「ツールバーをカスタマイズ…」というのを選ぶと「パス」ボタンがあるので、空いてる部分へドラッグします)。
Windowsなら即ショートカット作成ですが、Macのショートカットは作り方が分かりませんでした。適当にフォルダをFinderのヘッダへドラドロしたら、ポコっとフォルダのアイコンが出来たので、きっとそれがMacのショートカットなのかなと思います。
で、並んでいるコンパイル済アプリのフォルダで、日付とプロジェクト名からビルド前後の2つのフォルダ構成を見比べてみると、、、ビルド前にあるacViewController.dが今日のフォルダには無い!
ここで初めて、「そう言えば、ビルド後に加えた変更と言えば、フォルダの位置を変えたっけな」と言うことに気付きました。
速攻でXcodeを終了して、プロジェクトのフォルダを元の位置に戻し、Xcodeで実機RUNしてみると、、、SIGABRTが出ない!ヤッター!!

ちなみに、リジェクト対策の修正(実機環境でwatchdogの起動遅延タイムアウト)の方も、私の勘違いによるミスが原因だったようです。
UIViewControllerを継承したクラスでは、viewWillAppear→viewDidLoadの順に、最初から書かれたメソッドが実行されると勘違いしてました。
実は、その逆だと言うことをコチラのページ(「Linux & App Labs by pt106」)で知りました。
既に、AppDelegate.mの方から、余計な手続きはviewController.mへ移してありましたが、アプリ表示までもスムーズになるようviewControllerの初期化の手順を元の順番になるように戻しました。さらに、アプリ表示までの時間が短縮されるよう、余計な手続き(音の準備やAdMobの設置)はviewDidAppearへ回しました。

まぁ、何とか修正も済んで、再申請の準備も出来ました。

昨日は、ついにiPhone5が発表されましたね。iPhone5の発表までにリリースしたかった、私の初の自作アプリはまだリリースできておらず、、、。iPhone5発売の9/21までには、審査が通って何とかリリースできたら嬉しいなぁと考えております。
でも、iPhone5ってことはiOS6も出るんですよね。Xcodeの方でも、何か変わるところあるのかなぁ。

ちなみに、必死であさっての方向の解決策を調べてる時に見つけた、今後役に立つかもしれない神ページをリストアップしておきます。

★★★自作iPhoneアプリをAppStoreでリリースするまでの道のり★★★