Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門(3)

書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門(3)

Cordova: アプリの設定

2014年2月18日

Apache Cordovaアプリの開発準備が整ったら、そのアプリや、iOS/Androidなど特定のプラットフォームでの挙動の詳細を設定しよう。書籍転載の3本目。

  • このエントリーをはてなブックマークに追加

 オープンソースのフレームワーク「Apache Cordova」(Adobe版:「 PhoneGap」)を用いると、HTML5でiOSとAndroid向けのアプリをまとめて作成できます。この連載記事(=書籍転載)の第1回第6回で、その開発方法を一通り解説しています。また、第7回からは、「JavaScriptコード」と「iOS/Andoridネイティブ機能」をつなぐ仕組みを説明しています。

書籍転載について

 本コーナーは、技術評論社発行の書籍『[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 『[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門』の詳細や購入は技術評論社のサイト目次ページをご覧ください。

ご注意

本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

 前回は「4.2 Cordovaを用いてアプリを開発する」を説明しました。本稿はその続きです。

4.3 アプリの設定

 Cordovaを用いたアプリには、アプリや特定のプラットフォームでの挙動の詳細を設定する様々なパラメータが存在します。

 アプリの設定は、wwwディレクトリ以下のconfig.xmlファイルを編集して行います。このconfig.xmlに記述した設定は、cordovaコマンドラインツールにより、各プラットフォーム特有のプロジェクトのconfig.xmlに反映されます。

 ここではconfig.xmlの基本的な構造やその設定項目を説明します。併せて、プラットフォームごとに異なるアプリのアイコンやスプラッシュスクリーンの設定についても説明します。

4.3.1 config.xmlの構造

 Cordovaが参照するconfig.xmlのスキーマは、W3Cの策定する以下の仕様に基づいています。

 この仕様は、汎用的なWebアプリをパッケージ化する際のメタデータを記述する設定ファイルのスキーマを定めています。config.xmlは、具体的にはリスト4.5のように構造化されています。

XML
<widget>
  <name></name>
  <preference />
  <feature>
    <param />
  </feature>
  <access />
  <content />
</widget>
リスト4.5 www/config.xmlの基本構造
preference要素

 Cordovaフレームワークでは、実行時のフレームワークの挙動を設定で変更できます。name属性には設定の名前、value属性には設定の値を記述します。

access要素

 アプリ内で許可するドメインをホワイトリスト形式で記述します。この要素に記述されていないドメインでホストされているHTMLは読み込めません。

feature要素

 Cordovaフレームワークでは、端末のある特定のネイティブ機能へのアクセスをプラグインが提供します。Cordovaフレームワークは、実行時にこのfeature要素を見て、どのプラグインが有効になっているのかを知ります。feature要素では、アプリが利用するプラグイン名とそれに対応するネイティブ側のプラグインのクラス名を指定します。

 この設定は、後述するcordova pluginコマンドによって自動的に挿入されるので、多くの場合、開発者が記述する必要はありません。

content要素

 この要素では、Cordovaを用いたハイブリッドアプリが最初に読み込むHTMLのパスを指定します。デフォルトでは、index.htmlが読み込まれます。

XML
<content src="hoge.html" />
リスト4.6 content要素の設定例

4.3.2 アプリに関する設定

 www/config.xmlを編集して、アプリに関する基本的な情報を設定します。

 アプリの識別子は、widget要素のid属性で指定します。Androidアプリでは、アプリの識別子がアプリケーションのパッケージ名として利用されます。iOSでは、AppIDとして利用されます。アプリの識別子は、逆ドメイン形式で記述します。アプリのバージョンは、widget要素のversion属性で指定します(リスト4.7)。

XML
<widget id="com.example.hellohello" version="0.0.1"
  xmlns="http://www.w3.org/ns/widgets"
  xmlns:cdv="http://cordova.apache.org/ns/1.0">
リスト4.7 widget要素の設定例

 アプリ名は、widget要素以下にname要素を用いて記述します。アプリ名は、iOS用のプロジェクトではプロジェクト名としても利用されます(リスト4.8)。

XML
<name>HelloWorldApp</name>
リスト4.8 name要素の設定例

 Cordovaフレームワーク用の設定値は、widget要素以下にpreference要素を用いて設定します。例えば、iOSのCordovaフレームワークで利用できる“DisallowOverscroll”の設定は、リスト4.9のように記述します。

XML
<preference name="DisallowOverscroll" value="true" />
リスト4.9 preference要素の設定例

 アプリに関する設定では、他にもアプリの概要を記述するdescription要素と、アプリの開発者について記述するauthor要素がありますが、これらはiOSとAndroidのプロジェクトではあまり利用されていないようです。

4.3.3 設定を反映させる

 ここでいったん設定を反映する手順を確認します。www/config.xmlを編集して変更した設定を、プラットフォーム別のプロジェクトに反映します。

Bash
$ cordova prepare -d
リスト4.10 設定を各プラットフォーム向けのプロジェクトに反映させる

 このコマンドを実行すると、プロジェクトの情報やコンテンツが、platformsディレクトリ以下の各プラットフォーム向けのプロジェクトに反映されます。

 config.xmlは、各プラットフォーム向けのプロジェクトディレクトリ以下にもあります。各プラットフォームのCordovaフレームワークが実際に実行時に読み込んでいる設定ファイルはそのconfig.xmlです。

 iOSのプロジェクトでは、platforms/ios/(アプリ名)/config.xmlにあります。Androidのプロジェクトでは、platforms/android/res/xml/config.xmlにあります。

4.3.4 Android特有の設定項目

 Androidアプリで利用できる設定項目は以下のようになります。

loadingDialog

 アプリの読み込み中に、ネイティブのロード中を表すダイアログを表示します。フォーマットは、「タイトル,読み込み中です…」です。

loadingPageDialog

 HTMLのページを読み込んでいるときに、ネイティブのロード中を表すダイアログを表示します。遷移してHTMLを読み込むたびに表示されます。フォーマットは、loadingDialog設定と同様です。

errorUrl

 アプリのエラーページを設定します。Androidプロジェクトのwwwディレクトリからのパスを指定します。

backgroundColor

 アプリの背景色を指定します。4バイトの16進数をサポートしています。最初の1バイトはアルファ値で、残りの3バイトは標準的なRGB値です。例えば、00000000は透明な黒です。真っ白にするにはffffffffです。

loadUrlTimeoutValue

 Cordovaがアプリを読み込む際に、タイムアウトエラーを投げるのをどれくらい待つかを設定します。

keepRunning

 アプリがバックグラウンドに回ってもCordovaを実行し続けるかどうかを設定します。trueかfalseを指定します。デフォルトはtrueです。

splashscreen

 res/drawableディレクトリ以下の画像を拡張子なしで指定します。

disallowOverscroll (boolean, defaults to false):

 Androidではオーバースクロールするときに、画面の端が光るような表現が用いられます。この設定では、オーバースクロール時の表現をなくすかどうかを設定します。trueかfalseを指定します。デフォルトはfalseです。

4.3.5 iOS特有の設定項目

 iOSアプリで利用される設定項目は以下のようになります。

DisallowOverscroll

 WebViewをオーバースクロールさせたくない場合にtrueを設定します。trueかfalseを指定します。デフォルトはfalseです。

TopActivityIndicator

 ステータスバーに表示されるインジケータの種類を設定します。このインジケータは、アプリがネットワーク通信するときなどに表示されます。Cordovaでは、ページの読み込み中にはこのインジケータが表示されます。執筆時の最新のCordova3.0.6にはバグがあり、このインジケータは表示されません。有効な値は、whiteLargeとwhiteとgrayです。デフォルトはgrayです。

EnableViewportScale

 metaタグによるviewportのスケールを有効にしない場合にtrueを設定します。trueにすると、metaタグのviewportでスケールが有効になりません。trueかfalseを指定します。デフォルトはfalseです。

AutoHideSplashScreen

 アプリの起動時に表示するスプラッシュスクリーンを消すタイミングをJavaScriptから指定するときにはfalseを指定します。trueかfalseを指定します。デフォルトはtrueです。

FadeSplashScreen

 スプラッシュスクリーンを表示・非表示するときにフェードイン・フェードアウトさせるかどうかを設定します。trueかfalseを指定します。フェードイン・フェードアウトさせたくない場合にはfalseを指定します。デフォルトはtrueです。

FadeSplashScreenDuration

 フェードイン・フェードアウトするときのアニメーションの長さを秒数で指定します。デフォルトは2です。小数点も指定できます。

ShowSplashScreenSpinner

 表示されたスプラッシュスクリーンの上にスピナーを表示しない場合にfalseを指定します。trueかfalseを指定します。デフォルトはtrueです。

MediaPlaybackRequiresUserAction

 HTML5videoタグの自動再生を許可しない場合にtrueを指定します。trueかfalseを指定します。デフォルトはfalseです。

AllowInlineMediaPlayback

 HTML5videoタグでのプレイバックを許可する場合にtrueを指定します。なお、HTML側でもvideoタグの属性にwebkit-playsinlineを追加しておく必要があります。trueかfalseを指定します。デフォルトはfalseです。

BackupWebStorage

 Webストレージをどこにバックアップするかを設定します。noneとcloudとlocalのいずれかを指定します。cloudを指定した場合、ストレージはiCloudにバックアップされます。localを指定した場合、iTunes経由でバックアップされます。Webストレージをバックアップしない場合には、noneを指定します。

KeyboardDisplayRequiresUserAction

 JavaScriptのfocusメソッドを通じて、フォーム要素にフォーカスしたとき、iOSのソフトウェアキーボードを表示したい場合にはfalseを設定します。trueかfalseを指定します。デフォルトはtrueです。

SuppressesIncrementalRendering

 すべてのビューを受け取ってからアプリ内部のHTMLをレンダリングする場合にtrueを設定します。trueかfalseを指定します。デフォルトはfalseです。

HideKeyboardFormAccessoryBar

 ソフトウェアキーボードの上に表示されるツールバーを消したい場合にtrueを設定します。このツールバーには、[Prev][Next][Done]ボタンが表示されます。trueかfalseを指定します。デフォルトはfalseです。

KeyboardShrinksView

 ソフトウェアキーボードが表示されるときに、キーボードの大きさに合わせてWebViewの高さを変更する場合にtrueを設定します。falseに設定すると、WebViewのサイズは変わらず、WebView上にソフトウェアキーボードがかぶさるようになります。trueかfalseを指定します。デフォルトはfalseです。

4.3.6 アプリのアイコンを設定する

 アプリのアイコンやスプラッシュスクリーンを設定するには、platforms以下のプラットフォームごとのプロジェクトを編集します。

 例として、Androidのアイコンを編集しましょう。platforms/android/resディレクトリにはAndroidアプリで利用するリソースが納められています。このディレクトリ以下にアイコンを表すPNGファイルを置きます。

 Androidのアイコンとして必要な画像ファイルは4つです。Androidは、様々な解像度を持つデバイスに対応するために、デバイスのディスプレイのピクセル密度をldpi、mdpi、hdpi、xhdpiの4つに分けています。アイコン画像もこれに合わせて4つ用意します。表4.3は、resディレクトリ以下のアイコン画像ファイルの場所とそのアイコンが必要とする画像のサイズです。

アイコンのファイル名必要な画像の大きさ
drawable-ldpi/icon.png 36×36px
drawable-mdpi/icon.png 48×48px
drawable-hdpi/icon.png 72×72px
drawable-xhdpi/icon.png 96×96px
表4.3 アイコンの場所とアイコン画像の大きさの対応

 アイコン画像には、ここで挙げているサイズの画像以外にもGoogle Play Storeに提出する際に512×512pxサイズの画像が必要となります。この512×512pxのアイコンは、GooglePlay StoreアプリやWebサイトでアプリのアイコンとして表示されます。

 次にiOSのアイコンを編集しましょう。iOSアプリのアイコンは、platforms/ios/

 HelloWorld/Resources/iconsディレクトリ以下に納められています。iPhoneとiPadとそれらのRetina版のアイコン画像を用意する必要があります(表4.4)。

アイコンのファイル名必要な画像の大きさ
icon.png 57×57px
icon@2x.png 114×114px
icon-72.png 72×72px
icon-72@2x.png 144×144px
表4.4 iOSアプリのアイコン画像

 iOSアプリでは、Retinaディスプレイ用の画像リソースには、ファイルの拡張子の前に「 @2x」を付けます。

 またAndroidと同様、ここで挙げているサイズ以外にもApp Storeに提出する際に1024×1024pxのサイズのアイコン画像が必要です。

4.3.7 アプリのスプラッシュスクリーンを設定する

 スプラッシュスクリーンとは、アプリの起動時に表示する画像です。

 Androidアプリでスプラッシュスクリーンを設定するには、config.xmlのsplashscreen設定に画像名を記述します(リスト4.11)。Androidアプリでは、リソース中の画像を表す識別子に拡張子を用いません。この画像の名前には、拡張子を含めないでください。

XML
<preference name="splashscreen" value="splash" />
リスト4.11 Android用のスプラッシュスクリーンに使う画像を指定する

 上記の例では、画像名として「splash」を指定しているので、スプラッシュ画像として

 splash.pngをplatforms/android/res以下に、アイコン画像と同様に複数のピクセル密度向けの画像(ldpi、mdpi、hdpi、xhdpi)を納めてください。

 ここで、1つ注意すべきことがあります。Androidではディスプレイの大きさが標準化されておらず、デバイスによってバラバラなのです。では、Androidでスプラッシュスクリーンのために用意する画像のサイズはどうすればよいのでしょうか?

 Androidアプリ開発では、こういったときのために9patchと呼ばれる伸び縮みの箇所を指定できる画像フォーマットを利用します。PNGを拡張したこの画像形式の拡張子には「.9.png」を用います。このスプラッシュスクリーン画像にもこの9patch形式の画像を用意してください。

 用意する画像のパスとその画像の最低限のサイズの大きさの対応は表4.5になります。上記のスプラッシュスクリーンの設定では画像名に「splash」と付けているので、それと同じ名前の画像ファイルを置きます。

画像のファイル名画像サイズ(縦×横)
drawable-ldpi/splash.9.png 426×320px以上の9patch画像
drawable-mdpi/splash.9.png 470×320px以上の9patch画像
drawable-hdpi/splash.9.png 640×480px以上の9patch画像
drawable-xhdpi/splash.9.png 960×720px以上の9patch画像
表4.5 Android用のスプラッシュスクリーン画像の置き場所(platforms/android/resディレクトリ内)

 9patch画像は、自動的にデバイス画面前面を覆うように表示されます。9patch形式の画像は、Android SDKに含まれているdraw9patchというアプリケーションを利用します。

 Android SDKにパスを通してある状態ならば、以下のようにターミナルでdraw9patchコマンドを実行すると、9patch形式の画像を作成するツールが開きます。draw9patchコマンドは、Android SDKのsdk/toolsディレクトリにあります。

Bash
$ draw9patch

 iOSアプリでは、iOS自体がスプラッシュスクリーンを表示する仕組みを持っています。あらかじめのスプラッシュスクリーン用の画像を置くだけで有効になります。iOS用のスプラッシュスクリーン画像の置き場所は、platforms/ios/(プロジェクト名) /Resources/splashディレクトリです。画像の種類は表4.6のようになります。

画像のファイル名画像のサイズ(縦×横)
Default-568h@2x~iphone.png 640×1136
Default-Landscape~ipad.png 1024×748
Default-Landscape@2x~ipad.png 2048×1496
Default-Portrait~ipad.png 768×1004
Default-Portrait@2x~ipad.png 1536×2008
Default~iphone.png 320×480
Default@2x~iphone.png 640×960
表4.6 iOS用のスプラッシュスクリーン画像

 iOSアプリでは、起動時のオリエンテーションをスプラッシュスクリーンの画像の有無で指定します。例えば、Default-Portrait~ipad.png画像がある場合には縦画面で起動しますし、Default-Landscape~ipad.png画像がある場合には、横画面でも起動します。

 Default-568h@2x~iphone.pngは、iPhone5以降のディスプレイで表示されるスプラッシュスクリーン画像です。この画像がない場合には、iPhone5の解像度に対応していないアプリとして判断され、アプリは上下に黒い帯が出た状態のまま動作するようになります。

4.3.8 ドメインホワイトリストを設定する

 Cordovaアプリケーションで読み込まれるHTMLは、JavaScriptからネイティブの機能へアクセスできる特殊な環境に置かれています。

 このため、信頼できないHTMLを読み込んでしまうとCordovaが提供するネイティブ機能を通じて端末の情報を盗まれる危険があります。config.xmlのaccess要素は、こういった危険を避けるために信頼できるドメインを設定して、それ以外の信頼できないドメインのHTMLは読み込まないようにします。

ドメインホワイトリストの基本的な設定方法

 ドメインホワイトリストは、config.xml内でaccess要素によって記述します。

 cordovaコマンドでプロジェクトを作成したときには、access要素はリスト4.12のように記述されています。

XML
<access origin="*" />
リスト4.12 www/config.xmlの中のaccess要素

 これは、どのドメインのHTMLも読み込まれるように設定されています。例えば、ページ中でどこかの別のページに遷移します。そのページの中でcordova.jsを読み込むと、そのアプリで提供されているCordovaのネイティブ機能をそのページでも利用できるようになります。

 ここでは、信頼できるドメインのみを適切に指定することが重要です。アプリ内で外部のHTMLを読み込む必要がなければ、access要素は削除してください。

 access要素は、複数指定することができます。例えば、http://example.comとhttp://foobar.example.comのページの読み込みを有効にする場合には、リスト4 .13のようにaccess要素を2つ並べます。

XML
<access origin="http://example.com" />
<access origin="http://foobar.example.com" />
リスト4.13 ホワイトリストを複数定義する

 指定するドメインには、パターンを用いることができます。例えば、example.comのサブドメインすべてをホワイトリストに追加するには、リスト4.14のようにサブドメインの部分に「*」を指定します。

XML
<access origin="http://*.example.com" />
リスト4.14 サブドメインを一括して指定する

 access要素のorigin属性に指定できる文字列は、W3C Widget Accessの仕様に基づいています。

 次回は「4.4 プラットフォームごとにカスタマイズする」を説明します。

久保田光則(くぼたみつのり)

東京都在住。アシアル株式会社に所属するUI/UXデザイナー兼ソフトウェアエンジニア。社内では,HTML5ハイブリッドアプリの開発に多数関わる。優れたデザインとエンジニアリングを両立したオーバークオリティなアプリケーションの開発を実現するために日々,頑張る。

アシアル株式会社(あしあるかぶしきがいしゃ、Asial Corporation)

PHPなどのサーバサイドの技術と,PhoneGapなどのスマートフォン関連を中心とした開発を手がける技術ベンチャー。HTML5ハイブリッドアプリをブラウザ上で開発できるMonacaや,PhoneGapの日本語情報を配信するPhoneGap Fanなどのウェブサービスを手がける。

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門(3)
1. Cordovaを用いた開発環境を構築する

Cordovaフレームワークを用いてハイブリッドアプリを開発するための基本的な手順を紹介。書籍転載の1本目(「Part 1《基礎編》 第4章 Cordovaを用いたアプリ開発の流れ」より)。

書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門(3)
2. Cordovaを用いてアプリを開発する

Cordovaアプリケーションを開発する手順を説明。書籍転載の2本目(「Part 1《基礎編》 第4章 Cordovaを用いたアプリ開発の流れ」より)。

書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門(3)
3. 【現在、表示中】≫ Cordova: アプリの設定

Apache Cordovaアプリの開発準備が整ったら、そのアプリや、iOS/Androidなど特定のプラットフォームでの挙動の詳細を設定しよう。書籍転載の3本目。

書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門(3)
4. Cordova:プラットフォームごとにカスタマイズする

アプリをクロスプラットフォーム対応にする際に、プラットフォームごとに少し違った挙動にする方法を解説。書籍転載の4本目。

書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門(3)
5. Cordovaプラグインを利用する

Cordovaで提供されているプラグインの概要と、実際にアプリのプロジェクトへプラグインを導入する方法を説明する。書籍転載の5本目。

サイトからのお知らせ

Twitterでつぶやこう!