ブラウザからアプリを起動する為のリンクを用意する

まずはアプリを起動する為のブラウザのリンク。

<a href="paraches://paraches.com/openwith?name=テスト&url=http://www.paraches.com/">Link</a>

例えばこんな感じ。
リンクは scheme, host, path, query でできてる。
この場合

となってる。


で、このリンクをクリックすると scheme : paraches に対応するアプリケーションを探して起動して nameと urlの値を渡してくれる。


はてなで上記のリンクを張ることがことができなかったので、FC2の昔のブログにリンクを作ってみた。
サンプルを試す場合はこのリンクで起動できる。

以下、受け取る側の実装方法。

scheme でアプリケーションを起動して引数を受け取る(iOS編)

前にプロジェクトの設定方法を書いたな〜と思って探したら、アプリケーションから写真を指定して拙作「写真印刷」を起動する方法の説明だった…。

というわけで、Xcode 4.3.3でプロジェクトの設定は以下の通り。
1. プロジェクトの「TARGETS」の「Info」タブを表示、右下の「Add」ボタンをクリック
 


2. 表示されるメニューで「URL Types」を選択
 


3. 「Untitled」の URL Typeが加わるので、開いて各種情報を入力
 

  • URL Schemes : 起動する為の scheme。今回の例では paraches。


今回はこれだけ設定してあれば OK。
リンクをクリックするとアプリケーションが起動する。


で、アプリが起動すると - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions が呼ばれるので、その中で UIApplicationLaunchOptionsURLKey を使ってブラウザでクリックした URL を受け取れる。
具体的にはこんな感じ。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSURL *clickedURL = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    ...
}

でも、これだと先の URL そのままで nameや urlの値を取り出すのが面倒…。


そこで見つけたのがこのページ。

あ〜こりゃ楽チン!
カテゴリで NSURL に queryAsDictionaryってメソッド加えてこれ一発で引数が貰える。


こんな感じ。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSURL *clickedURL = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    NSDictionary *query = [clickedURL queryAsDictionary];
    NSString *nameString = [query objectForKey:@"name"];
    NSString *urlString = [query objectForKey:@"url"];
    ...
}

これで、渡されたデータを使ってアプリ側であれこれすれば OK!


先のリンクをクリックして nameと urlを表示するサンプルも作ってみた。

scheme でアプリケーションを起動して引数を受け取る(Android編)

Androidの場合は以下のページが解り易いと思う。

Android の場合は Intentでアプリケーションを起動するので、AndroidManifest.xmlの設定をする必要がある。

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="paraches" android:host="paraches.com"  android:pathPrefix="/openwith" />
</intent-filter>

最初の はデフォルトで入っているもの。


次の scheme使って起動する際のもの。
ブラウザからのリンクを想定しているので に BROWSABLE が入ってる。
では scheme, host, pathPrefix をそれぞれ指定している。
この例では3つとも指定しているけど、例えば scheme だけを指定しても大丈夫。その場合は hostや pathPrefixがどんな値でもアプリが起動する。


で、アプリケーションが起動すると Activity の onCreate が呼び出されるのだけど、そこで URL のデータを取り出すにはこんな感じで。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    if (Intent.ACTION_VIEW.equals(action)) {
    	Uri uri = intent.getData();
    	if (uri!=null) {
    		String name = uri.getQueryParameter("name");
    		String url = uri.getQueryParameter("url");
            ...
        }
    }
}

Android だと get.QueryParameter() なんてのがあってサックリと引数をゲットできて楽チン!


Androidのサンプルはこちら。