cordova プロジェクトで platform が依存する cordova バージョンを確認する方法

cordova プロジェクトにおいて、個々のプラットフォームがビルドに必要とする cordova のバージョン番号を確認するには、CordovaLib 以下にある VERSION ファイルの中身を参照すれば OK です。

具体的な例として、例えば ios プラットフォームの場合、プロジェクト直下で以下のコマンドを実行すればバージョン番号が確認できます。

$ cat ./platforms/ios/CordovaLib/VERSION 
3.5.0

ちなみに、このバージョン番号は CORDOVA_VERSION_MIN_REQUIRED として CDVAvailability.h 内でも定義されているとおり、特定のプラットフォームにおいてビルドを実行するのに必要となる「最小のバージョン番号」になります。

CORDOVA_VERSION_MAX_REQUIRED という定数は定義されていないため、感覚的にはこれよりも大きい cordova バージョンを使えば問題なさそうですが、実際には cordova バージョンが大きすぎる場合ビルドに失敗することがあります。

もし cordova build が失敗する場合は、このファイルで定義されているバージョン番号と同じか、少しだけ大きいバージョン番号で試すと良いでしょう。

$ grep "CORDOVA_VERSION_MIN_REQUIRED __CORDOVA" ./platforms/ios/CordovaLib/Classes/CDVAvailability.h
    #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_3_5_0

このプロジェクトの例では、cordova 3.5.0-0.2.0 〜 3.6.3-0.2.13 では問題ありませんでしたが、cordova 4.0.0 〜 ではビルド NG でした。

バグが出たからと数年前に納品済みのアプリのソース一式を渡されて、ビルドすらできずに戸惑った自分への戒めを含めたメモでした。

AppStore経由でのXcode 4.2アップデートにハマる

Xcode4から、入手先がAppStore経由でのダウンロード方式に変わったわけですが、これで見事にハマりました。
正確にはXcodeではなくAppStoreなんですが。

Xcode4.2にアップデートしようとしたものの、1.8GBもあるファイルを一気に落としきれず、一旦中断。
ダウンロード途中のファイルは一時フォルダに格納されてレジューム状態に入るため、再開すれば中断した状態からダウンロードが再開される・・・はずだったんですが、これがいつまでたっても再開しないのです。

AppStoreを立ち上げ直したり、アカウントをサインアウト&サインインしてみても効果なし。
AppStoreのメニューには[Store]→[ダウンロードが完了していない項目があるか確認…]という、いかにもそれらしい項目は存在するのですが、こちらをクリックしても「全てダウンロードされています」と表示されるだけ。

諦めてXcode4.1で開発続けようとも思いましたが、残っている作業はiOS5での実機テストだったので、SDKがないことにはインストールもできません。ほとほと困ってしまいました。

で、ひょっとしたらレジューム状態の一時ファイル消しちゃえばいいんじゃない?と思いついたわけです。

結果的にこれがアタリだったわけですが、まず一時ファイルの格納先がわからず調査。
するとAppStoreにデバッグモードなんてナイスなモードが存在することが分かりました

Where does the Mac AppStore download temp files to
http://www.ryanragle.com/index.php?/site/comments/where-does-the-mac-app-store-download-temp-files-to

具体的には、ターミナル上から「defaults write com.apple.appstore ShowDebugMenu -bool true」と叩いてからAppStoreを立ち上げると、メニュー最後尾に「Debug」が追加されます。ここから「Show Download Folder…」を選択すると、ファイルの格納先が表示されます。私の環境では「/private/var/folders/0s/[英数字の羅列]/C」というパスでしたが、このあたりは環境によって異なってくるかと思われます。

で、そのフォルダ直下にあった「com.apple.Xcode.501」フォルダをまるっとゴミ箱へ放り込み、AppStoreを起動します。
すると「アップデート」のアイコンに「①」というバッジが表示されており、クリックするとXcodeがダウンロード開始をゼロの状態で待ち受けていてめでたしめでたし、というわけでした。

ちなみにインストール完了後、自動的にXcodeが4.2にアップデートされるわけではなくて、アプリケーションフォルダにある「Install Xcode.app」を起動することでXcode 4.2への更新が始まります。なんで?って感じなんですけどね。恐らくはAppStoreのレジューム機能を活用したかったのではないかと邪推するわけですが、それにしても直感的でないですよね。アップルらしくないというか。

iPhoneのファームウェア置き場

iPhoneアプリを開発していると、様々な実機でかつ様々なOSバージョンでテストする必要に迫られるわけですが、肝心のOSファームウェアをAppleが公開していません。

iTunes経由でファームウェアの復元を行う場合、Windows環境であればctrlを、Mac環境であればoptionを押しながら「復元」ボタンを押せば、復元対象となるファームウェア(.ipswファイル)を指定できるわけですが、ローカルに保存されるファームウェアは最新のイメージを除いて全て削除されてしまう(少なくともMac環境では)ため、毎回アップデートをかける前に1世代前のファームウェアを別のフォルダにコピーする、という作業を怠ってしまうと取り返しの付かないことになってしまいます。

そこで必然的にグレーなROM置き場が必要になってくるわけですが、私が見つけたのはここ。
iPhone以外のアップル製品のファームウェアも置いてあります。

iPod, iPhone and iPad Firmware Download
http://www.felixbruns.de/iPod/firmware/

上記サイトはこちらのサイトを辿って見つけました。(ありがとうございます)

iPhoneOSの保存先
http://pentan.info/iphone/iphone_os.html

ちなみにMacだと、iTunes経由でローカルに保存されるファームウェアは
/Users/[ユーザ名]/Library/iTunes/iPhone Software Updates
に格納されているのですが、OS X 10.7 Lionでは隠しフォルダ扱いになってしまい、Finder上に表示されません。
常に表示状態にする
にはターミナル上から「chflags nohidden ~/Library/」と叩くと見えるようになります。
非表示状態に戻すには「chflags hidden ~/Library/」です。

参考サイト:
OS X 10.7 Lion で隠しフォルダになったライブラリを常に表示させる方法
http://tukaikta.blog135.fc2.com/blog-entry-166.html

Appのアップデートが「インストール中・・・」のまま終わらない

instagramのアップデート中に発現したのですが、恐らくほかのアプリでも同じような現象に遭遇する可能性はあると思います。結論から言いますとロックボタン長押し→電源を切る→再度電源ONで直ったのですが、途中で母艦macに繋いだために余計におかしな事になってしまいました。 以下私の顛末。

  • iphoneからapp storeに接続して、instagramのアップデートを実行
  • 「インストール中」のままステータスバー動かなくなる
  • ひとまずiphoneの電源オフ
  • バッテリが少なかったので、そのまあ母艦に接続(これが間違いの始まり)
  • 母艦に接続したとたん、iphone勝手に起動
  • Instagramがあった場所に、真っ白のアイコンと「待機中・・・」の文字
  • 母艦と同期すれば直るんじゃないかと安易に考えiTunesから「同期する」を実行
  • 同期完了。しかしiphoneの状態変わらず。というか母艦のApp画面にはInstagramに加えて「待機中・・・」という謎の真っ白なアイコン出現(この時点で結構焦りはじめてます)
  • iPhone上で白アイコンを長押し。しかし削除できない(というか反応しない)
  • iTunesを使ってiPhoneからInstagram削除。「アプリのデータが全て消えます」というメッセージに泣く泣く同意
  • iphoneと再同期。しかし依然として白アイコン消えず。
  • 思いつく対処法がなくなってしまいやや呆然
  • Googleで「app 待機中」で検索して、Apple サポートコミュニティで対処法を見つける
  • 待機中のアイコンが消せません
    https://discussionsjapan.apple.com/message/100558373#100558373

  • 電源再投入。(でもこんな簡単なことで直るとは思ってない)
  • 何事もなかったように白アイコンがInstagramアイコンになってる。あれ?
  • というわけで、焦らずiPhone単体のまま再起動すれば問題なかったというオチです。中途半端に知識があると色々試してしまい、物事を余計に混乱させてしまう。まずは必要最小限のステップで確認できる方法から、徐々に範囲を広げていくのが正しいやり方なんだと改めて考えさせられました。