2011年 02月 21日

Android でウェブ側からアプリケーションを起動したいときのベストプラクティス

ウェブ側からリンクを貼って特定のアプリを起動させる場合、独自スキームを使うというのは自然な流れでまぁ普通そうしたい感じですが、対象アプリが入っているか否かをウェブ側から取得することができないため (できるの?)、アプリが入ってないユーザさんに対してブラウザのそっけないエラー画面になってしまうのであまり好ましくありません (アプリが入っていることがほぼ確実ならこれでいいけど)

現状でこの方法は簡単には解決できなくて、おそらく現状のベストプラクティス的には http を併用するのかと思っています。

  • fooscheme:openapp をアプリケーションでハンドリング
    • 確実にアプリが入ってることが判定できる場合に使う?
      • 普通にインテント使えばいいので、たぶんあんまり使うケースない……
    • スキーム無闇に増やすと怒られる
  • http://mydomain/openapp をアプリケーションでハンドリング
    • ウェブからアプリを起動したいときに使う
    • URLには「アプリケーションをインストールする」ページを作っておく
    • このURLにアクセスすると Browser とアプリ2つ表示されてしまうので、デフォルトでアプリを開くようにユーザを促す
        <activity android:name=".PostEntryActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait" android:configChanges="orientation">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.ALTERNATIVE" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="fooapp" android:host="open"/>
                <data android:scheme="http" android:host="fooapp.example.com" android:pathPattern="/openapp"/>
            </intent-filter>
        </activity>

とはいえ、この方法モノリスでやるときにとろうとしたんですけど、何かがうまくいかなかった気がするので本当にこれでいけるか不安です。(今試した感じ想像通りに動いたので、うまくいかなかったのは当時の勘違いだったかもしれない。あるいは Android1.6 だとブラウザ内の http:// に関しては確実に Browser が制御を奪ってしまっていたような気がする)