読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

PhoneGapでカスタムURLスキーム

PhoneGapで作成したアプリにiOSのカスタムURLスキームを与える方法と注意事項です。

実装方法

1. 他のアプリ同様にInfo.plistにURLTypesというキーを追加して、その下に必要なキーを追加します。
(キーURL identifierとキーURL schemes)

        <key>CFBundleURLTypes</key>
        <array>
                <dict>
                        <key>CFBundleURLName</key>
                        <string>XXX.XXX.XXX</string>
                        <key>CFBundleURLSchemes</key>
                        <array>
                                <string>XXX</string>
                        </array>
                </dict>
        </array>


2. アプリケーションのJavaScriptにwindow.handleOpenURL関数を用意し、devicereadyハンドラでinvokeString変数を処理するようにコールするようにします。

www.handleOpenURL = (url) ->
    # process url properly

document.addEventListener 'deviceready', (->
        # necessary initializations

        handleOpenURL(invokeString) if invokeString
    ), false

注意点

1. シミュレータでデバッグする時、バックグラウンドにプロセスがない状態からテストするには、XcodeのRunを止めること、シミュレータ側でプロセスを消すことの2つが必要です。プロセスだけ消してテストすると、アプリがスタートアップ画面でフリーズしたような感じになります。

2. (推測)PhoneGapではバックグランドプロセスのない場合のカスタムURLスキームは、URLがdidFinishLaunchingWithOptions:メソッドでinvokeString変数への代入の形で処理されて、handleOpenURL:には渡されていないようです。なので、handleOpenURL:からJavaScriptのhandleOpenURLがコールされません。これを補うために、devicereadyイベント内で代わりの処理を行います。