HTML5とPhoneGapで作る、iPhone/Androidアプリ開発TIPS

第1回PhoneGap 2.1.0リリース─Shazron氏ブログ/changelogで追うPhoneGapの新機能と修正点

PhoneGapはAdobeが開発、公開しているクロスプラットフォーム・モバイルアプリケーションの開発フレームワークです。PhoneGapを用いることで、HTML5+CSS+JavaScriptのみでさまざまなプラットフォームに対応するネイティブアプリケーションの実装が可能になります。この連載では、PhoneGapの新着情報や、PhoneGapを使ったiOSおよびAndroidアプリケーションの開発ティップスをお届けしていきます。どうぞお楽しみください。

PhoneGap/Cordovaとは

PhoneGapはAdobeが開発、公開しているクロスプラットフォーム・モバイルアプリケーションの開発フレームワークです。PhoneGapについてはPhoneGapで手軽にiPhone/Androidアプリを作ろう:第1回 PhoneGapとはを。PhoneGapとCordovaの関係については、もっと使おうPhoneGap/Cordova 2.0.0:第1回 PhoneGap/Cordovaとはをご参照ください。

PhoneGapで手軽にiPhone/Androidアプリを作ろう
  • 連載期間: 2011/8/31~2011/9/20
  • PhoneGap 1.0.0ベース
  • PhoneGapとは
  • PhoneGapで Hello, World!
  • PhoneGap:Build
  • PhoneGap API一覧
  • jQuery MobileとStorage APIでメモ帳アプリ
  • Camera APIとHTML5 Canvas、外部プラグインを利用したカメラアプリ
もっと使おうPhoneGap/Cordova 2.0.0
  • 連載期間: 2012/8/7~2012/9/26
  • PhoneGap 2.0.0ベース
  • PhoneGapとCordovaの関係
  • PhoneGap 2.0.0の変更点
  • PhoneGap 2.0.0において、ターミナル上でiOSプロジェクトの作成・iOSシミュレータ起動
  • weinreを使ったiOS/Androidアプリの動作検証
  • iOS/Androidアプリケーションのファイルシステム構造
  • iOS/AndroidアプリでFile APIを利用したファイル操作(ファイル・ディレクトリ読み書き/ファイルダウンロード・アップロード)
PhoneGapとは
PhoneGapとは

PhoneGap 2.1.0リリース、主要な11の変更点

9月21日(米国時間)、PhoneGap 2.1.0がリリースされました。

Cordovaの主要開発者の一人、Shazron Abdullah氏のブログ - Shazron's Cordova (aka PhoneGap) Blogにて、⁠11 upcoming changes for Cordova iOS 2.1.0」というタイトルの元で11の変更点がまとめられています。

  1. Automatic Reference Counting(ARC)のサポート
  2. パッケージインストーラ(.pkg)の削除
  3. CORDOVALIBの削除
  4. VERSIONファイルの削除
  5. CordovaLibサブプロジェクトより、CordovaLibApp/CordovaLibTestを削除
  6. プロジェクトを作成するコマンドライン用のスクリプトにて、パスにスペースが含まれる場合でも正常に動作するように
  7. ホワイトリストにフルパス表記をサポート。より厳格なルールで運用ができるように
  8. JavaScript->Nativeブリッジ改修。scroll CSSを使用した後でclick/touchイベントが発火しない問題を解消
  9. iOS6に対応
  10. 特定の環境下におけるコンパイルエラーを修正
  11. プラグインシグネチャの更新

iOS向け開発環境の変更点について、先に要点のみをまとめると、次のようになります。

  • Automatic Reference Counting(ARC)サポート
  • iOS6対応
  • 複数のCordovaバージョンを同時にインストールできるように
  • インストーラがなくなり、必要なファイルをすべて手動でインストールする必要がある
  • その他、バグフィックス

それでは主要な11の変更点を見ていきましょう。

1. Automatic Reference Counting(ARC)のサポート

メモリ管理--retain, release, autoreleaseコードの挿入をコンパイラに行わせるAutomatic Reference Counting(ARC)をサポートしました。ARCを用いる場合、PhoneGapプロジェクトで利用しているプラグインもARCに対応したコードに修正する必要があります。

2. パッケージインストーラ(.pkg)の削除

Mac OS X 10.8(Mountain Lion)以降ではGatekeeperが導入され、開発者署名のないインストーラはそのままではインストールできなくなりました。

Cordovaの開発チームは「Cordovaのソースコードを成果物としてリリースする」という理念に基づき、PhoneGapのパッケージバイナリに署名をしませんでした。この方針により、PhoneGap(Cordova)パッケージインストーラが成果物から削除されました。

Mac OS X環境でPhoneGapを使用する場合は、手動にて各種ソースファイル、スクリプトファイルをハードディスクに配置することになります。既存のPhoneGapプロジェクトをほかのディレクトリに移動したい場合は、update_cordova_subprojectコマンドを実行する必要があります。

3. CORDOVALIB変数の削除

PhoneGap 2.1.0以前ではCordovaLibサブプロジェクトの場所を、CORDOVALIB変数を参照することで取得していました。2.1.0では、CordovaLibサブプロジェクトの場所が直書き(hard-coded)されることになりました。この修正により、複数のCordovaバージョンをインストールした状態で開発・テストが可能になります。

使用するCordovaLibサブプロジェクトのバージョンを変更する場合は、前述のupdate_cordova_subprojectコマンドを実行する必要があります。

4. VERSIONファイルの削除

成果物よりVERSIONファイルが削除されました。VERSIONファイルはCordovaLibやDevice APIでデバイスの情報を取得した際、device.cordovaに格納される文字列を取得する際に読み出されていました。

この実装依存により、PhoneGapプロジェクト内にVERSIONファイルが存在しない場合にクラッシュする報告が寄せられていました。

5. CordovaLibサブプロジェクトより、CordovaLibApp/CordovaLibTestを削除

Schemeメニューに表示されていた、CordovaLibAppプロジェクトとCordovaLibTestプロジェクトが削除されました。

PhoneGap 2.0.0で作成したプロジェクトのScheme
PhoneGap 2.0.0で作成したプロジェクトのScheme
PhoneGap 2.1.0で作成したプロジェクトのScheme。CordovaLibApp, CordovaLibTestが表示されなくなっていることがわかる
PhoneGap 2.1.0で作成したプロジェクトのScheme。CordovaLibApp, CordovaLibTestが表示されなくなっていることがわかる

6. プロジェクトを作成するコマンドライン用のスクリプトにて、パスにスペースが含まれる場合でも正常に動作するように

ターミナル用でXcodeプロジェクトを作成する、createコマンドにて、プロジェクトのパスにスペースが含まれている場合、プロジェクトを正常に作成することができなかったバグが修正されました。

既存のコマンド群をインストールしている場合は、Cordova-2.1.0.dmgに含まれているコマンドでそのまま上書きすればOKです。

7. ホワイトリストにフルパス表記をサポート。より厳格なルールで運用ができるように

これまでホワイトリストには、ホスト名やIPアドレスのみを記述する必要がありました。PhoneGap 2.1.0では、http://またはhttps://からはじまる、スキーマやクエリ文字列を含めたパスを記述できるようになりました。

たとえばgihyo.jpホスト配下の、特定のリソースのみダウンロードを許可するといった指定が可能になります。より厳格なルールでホワイトリストの運用ができるようになったと言えるでしょう。

ホストの記述例動作
image.gihyo.co.jphttp://image.gihyo.co.jp/ 配下のすべてのリソースのダウンロードを許可します
http://image.gihyo.co.jp/assets/ templates/gihyojp2007/image/ gihyojp_logo.pnghttp://image.gihyo.co.jp/assets/ templates/gihyojp2007/image/ gihyojp_logo.pngのダウンロードのみを許可し、他のリソースはたとえ同じホストでもダウンロードを許可しません

8. JavaScript->Nativeブリッジ改修。scroll CSSを使用した後でclick/touchイベントが発火しない問題を解消

JavaScriptからネイティブの機能を呼び出す、通称「JavaScript -> Native bridge」が改修されました。これにより、scroll CSSを使用した後でclick/touchイベントが発火しない問題が解消されています。

注意点として、iOS 4.2.1環境下においてdevicereadyイベントが発火しない問題が報告されています。同環境下においてPhoneGap 2.1.0を使用する場合は、lib/ios/exec.jsにAndrew Grieve氏が公開しているパッチを当てる必要があります。

9. iOS6に対応

先日リリースされたiOS 6に対応しました。細かい修正点については後述の「changelog/JIRAから追う、PhoneGap 2.1.0の変更点」をご参照ください。

10. 特定の環境下におけるコンパイルエラーを修正

特定の環境下において、コンパイルエラーが発生して正常にビルドができなかった問題を修正しています。細かい修正点については「changelog/JIRAから追う、PhoneGap 2.1.0の変更点」をご参照ください。

11. プラグインシグネチャの変更

プラグインメソッドのシグネチャが変更になりました。旧来のシグネチャは非推奨(deprecated)となります。

これまでのシグネチャ
- (void) myMethod:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
新しいシグネチャ
- (void) myMethod:(CDVInvokedUrlCommand*)command;

PhoneGap 2.1.0のインストール方法(iOS)

PhoneGap 2.1.0の成果物には、iOS環境向けのインストーラ(.pkg)が含まれなくなりました。CordovaLibやXcodeプロジェクトを作成するためのファイルを、すべて手動にてローカルハードディスクに配置する必要があります。

手順は次のとおりです。

  1. PhoneGap 2.1.0をダウンロードし、解凍
  2. lib/ios/CordovaLibディレクトリをユーザディレクトリ直下にコピー
  3. lib/ios/binディレクトリをユーザディレクトリ直下にコピー

1. PhoneGap 2.1.0をダウンロードし、解凍

PhoneGap :Download & Archivesにアクセスし、PhoneGap 2.1.0の圧縮ファイルをダウンロードし、解凍します。

PhoneGap 2.1.0の圧縮ファイルを解凍
PhoneGap 2.1.0の圧縮ファイルを解凍

2. lib/ios/CordovaLibディレクトリをユーザディレクトリ直下にコピー

lib/ios/CordovaLibディレクトリを、ユーザディレクトリ直下にコピーします。複数のCordovaバージョンを使い分けたい場合は、CordovaLib-2.1.0といったようにバージョン番号をディレクトリ名に含めておきましょう。複数のCordovaバージョンを使い分けなくてもよい場合は、リネームの必要はありません。

リネームした場合や、ユーザディレクトリ直下以外の場所にコピーした場合は、createコマンドでXcodeプロジェクト作成後、Xcodeでプロジェクトを開いてCordovaLibのパスを正しいものに修正する必要があります。

3. lib/ios/binディレクトリをユーザディレクトリ直下にコピー

lib/ios/binディレクトリをユーザディレクトリ直下にコピーします。Xcodeプロジェクトを作成する場合は、ターミナルを起動して、binディレクトリ内の専用のコマンドを実行してプロジェクトを作成することになります。

なお、環境変数の設定方法やcreateコマンドを使ったプロジェクトの作成方法については、前連載「もっと使おうPhoneGap/Cordova 2.0.0」第2回 iOSプロジェクト作成の手順変更、ターミナルからiOSシミュレータを起動するをご参照ください。

また、Android版ではこれまでのデプロイ手順と同様なので省略します。

changelog/JIRAから追う、PhoneGap 2.1.0の変更点

GitHubのchangelogJIRAのチケットより、iOS/Android版のPhoneGap 2.1.0にて仕様が変更・修正された点を抜粋して紹介します。

iOS

PhoneGap全体の動作について
  • CB-675: 複数のPhoneGapバージョンをXcodeにインストールできるように
  • CB-45: ホワイトリストでフルパスのURL表記をサポート
  • CB-1000: JSONKitに関連する名前空間の問題を修正
  • CB-1138: デフォルトのロギングレベルにて、ファイルの中身をコンソールに書き出さないように
  • CB-1164: Xcode 4.4のあたらしいLLVMにて、ワーニングレポートが出力される問題を修正
  • CB-1182: iOS6の画面回転について、非推奨となったメソッドをコードから削除
  • CB-1192: Build SettingsにGCC_THUMB_SUPPORT=NOを追加
  • CB-1223: CORDOVALIB変数に、CordovaLibの場所を直書きするように
  • CB-1315: ビューのサイズを設定する際に、rootViewControllerを使用するように
  • CB-1380: iframeにデータURIスキームを渡した際に、Received Unhandled URLエラーが返る問題を修正
PhoneGapインストール
  • CB-1091: インストーラの削除
  • CB-1091: ターミナルでのmake時、Xcodeが起動している場合はエラーを返すように
PhoneGapコマンドラインツール
  • CB-1122: Xcodeプロジェクトの診断ツール(Diagnostic tool)を追加
  • CB-1124: createコマンドをはじめとしたツールにおいて、パスにスペースが含まれている場合動作しない問題を修正
  • CB-1136: createコマンドにて、シンボリックリンクを指定した場合に正常に動作しない問題を修正
  • CB-1137: 外部ディレクトリからemulate/logコマンドを実行した場合、正常に動作しない問題を修正
PhoneGap同梱ファイル
  • CB-1149: Hello, Worldサンプルアプリに、libディレクトリを追加。Jasmineを同梱するように
  • CB-1166: VERSIONファイルを削除
  • CB-1173: TemplateIcon.icns, TemplateInfo.plistファイルを削除
  • CB-1187: Objective-Cユニットテストのコードを、CordovaLib.xcodeprojから、CordovaTests.xcodeproj配下に移動
PhoneGapドキュメント
  • CB-1105: iOS Plugin Upgrade Guideに、JSONKitの名前空間に関するシグネチャの変更手順を追加
  • CB-1186: README.md/FirstRun.mdについて、新規インストール時の手順を追記
  • CB-1188: プラグインシグネチャの更新に関して、Update Plugin Upgrade Guideに追記
  • CB-1237: Cordova JavaScript Exception Logging.mdに、CDVDebugWebView.mへ"-fno-objc-arc"オプションを追加する手順を追記
  • CB-1258: execメソッドのテクニックに関するドキュメント--Changing the JavaScript to Native Bridge Modeを追加
Contacts API
  • CB-828: contact.save()が動作遅延・メモリリークする問題を修正
  • CB-1190: 連絡先の編集時にクラッシュする問題を修正
Events API
  • CB-593: scroll CSSを使用した後でclick/touchイベントが発火しない問題を修正
File API
  • FileTransferのuploadにおいて、不正なURLを指定した際にnull dereferenceが返る問題を修正
Media API
  • CB-1384: Web上の.wavファイルを再生できない問題を修正
  • CB-1402: onStatusイベントのtypo修正
Storage API
  • CB-903/CB-904: iOS6環境下では、WebKitStoreWebDataForBackupキーをYESに設定するように
  • CB-994: "Application does not run in background"をYESに設定している場合、CDVLocalStorageがフルバックアップを行わない問題を修正
プラグイン
  • CB-1106: 旧来のプラグインシグネチャを非推奨に
  • CB-1385: 古いプラグインを使用した際に、コールバックIDにnullが渡される問題を修正

Android

PhoneGap 全体の動作について
  • CB-1420: JavaScript更新 commit log
  • CB-1409: menuボタンをクリック時に「appView.getHitTestResult() the call to getHitTestResult is null.」エラーが発生し、Jellybeanがクラッシュする問題を修正 commit log
  • データURIスキームをサポート commit log
  • CB-1304: PhoneGap ReferencesをApache Cordovaにアップデート commit log
  • 起動時にVFYでadb waringsが表示されていた問題を修正 commit log
  • CB-1235: Windows用のAndroid/createスクリプトの問題を修正
  • LOAD_URL exec bridgeの実装 commit log
  • cordova.android.jsのexec()呼び出しの実装を更新 commit log
  • CordovaChromeClient/CordovaWebViewClientにて、API lint warningsが表示されていた問題を修正 commit log
  • CB-1257: Android 4.1においてnavigator.app.backHistory()を呼び出すと例外エラーが発生する問題を修正 commit log
  • Android SDKをGoogle APIs:16にアップデート commit log
PhoneGap 同梱ファイル
  • CB-1335: www/ アプリケーションをアップデート commit log
  • res/xml/config.xmlにEchoプラグインの記述を追加 commit log
  • res/xml/config.xmlのフォーマット変更 commit log
  • .gitignoreファイルを更新 commit log
  • CB-1147: Hello, Worldサンプルアプリが特定の環境でクラッシュする問題を修正commit log
PhoneGap ドキュメント
  • CB-1303: Callback プロジェクトに関する記述を削除 commit log⁠ ※ Callback は Apache Cordovaの旧プロジェクト名
  • CB-1301: releasenotes.mdを削除
  • CB-1305: guides/Cordova Upgrade Guide.mdを削除 commit log
Camera API
  • CB-1293: Camera.getPictureにて、AndroidのPicasaアルバムから写真を選択した際にクラッシュする問題を修正
  • CB-1212: カメラを起動して写真を撮らずにキャンセルした場合、ExifHelperで致命的なエラーが発生する問題を修正 commit log
Contacts API
  • 連作先取得時の動作速度を高速化 commit log
Events API
  • backbuttonの問題を修正 commit log
  • CB-1289: menubuttonイベントが2回重複して発火する問題を修正 commit log
  • pauseイベントでJSタイマーが停止後、再度有効にならない問題を修正 commit log
  • onlineイベントを実装 commit log
  • CB-1181: onKeyUpイベントが発火しない問題を修正 commit log
File API
  • mobile-specのテストケースにおいて、downloadメソッドで「should handle unknown host」エラーが発生していた問題を修正 commit log
  • CB-1290: mobile-specのテストケースにおいて、uploadメソッドでエラーが発生していた問題を修正 commit log
  • CB-312: HTTPS経由でファイルをアップロードしようとすると、OutOfMemoryErrorエラーが発生していた問題を修正
  • CB-930: DirectoryReaderオブジェクトにおいて、アクセスできないディレクトリを読みだそうとした場合にnullエラーコードが出力される問題を修正
  • CB-1151: FileTransferにデコードしたURLを渡した場合、404エラーが返る問題を修正 commit log
  • アップロード時にヘッダを送信できるように commit log
Media API
  • CB-1358: 録音中に電話着信した際、強制終了する問題を修正 commit log
  • CB-1267: Mediaオブジェクトの作成時にリセットをするように commit log
  • CB-1264: stop()後、play()メソッドを呼び出すとmOnErrorListener is null. Failed to send MEDIA_ERROR message.エラーが表示されていた問題を修正 commit log
  • CB-1196: ローカルmp3ファイルの再生完了時に、onSuccessイベントが発火していない問題を修正 commit log
  • CB-1206: file uriを指定しても正確なハンドルがされない問題を修正 commit log
Notification API
  • CB-1217: notification.alertで表示したダイアログが、backボタンをクリックしても動作しない問題を修正 commit log
プラグイン
  • コンフリクトしていたプラグインファイルをマージ commit log
  • ベンチマーク用のEchoプラグインを実装 commit log

iOSではiOS6リリースにおける内部実装の変更と、コマンドラインツール、同梱ファイルが中心に更新が行われています。Androidでは、Cordova API全般におけるバグフィックスや機能追加を中心に更新が行われました。

各種返り値や細かい挙動に修正が入っているため、既存アプリケーションでPhoneGapのアップデートを行う際は注意してください。

おすすめ記事

記事・ニュース一覧