ブラウザからアプリを起動する為のリンクを用意する
まずはアプリを起動する為のブラウザのリンク。
<a href="paraches://paraches.com/openwith?name=テスト&url=http://www.paraches.com/">Link</a>
例えばこんな感じ。
リンクは scheme, host, path, query でできてる。
この場合
- scheme : paraches
- host : paraches.com
- path : /openwith
- query : name=テスト&url=http://www.paraches.com/
となってる。
で、このリンクをクリックすると scheme : paraches に対応するアプリケーションを探して起動して nameと urlの値を渡してくれる。
はてなで上記のリンクを張ることがことができなかったので、FC2の昔のブログにリンクを作ってみた。
サンプルを試す場合はこのリンクで起動できる。
以下、受け取る側の実装方法。
scheme でアプリケーションを起動して引数を受け取る(iOS編)
前にプロジェクトの設定方法を書いたな〜と思って探したら、アプリケーションから写真を指定して拙作「写真印刷」を起動する方法の説明だった…。
というわけで、Xcode 4.3.3でプロジェクトの設定は以下の通り。
1. プロジェクトの「TARGETS」の「Info」タブを表示、右下の「Add」ボタンをクリック
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を表示するサンプルも作ってみた。
- MySchemeTest(サンプルコード)
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, 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のサンプルはこちら。
- MySchemeTestAndroid(サンプルコード)