強火で進め

このブログではプログラム関連の記事を中心に書いてます。

URL schemeを使ってアプリを起動する

(2011/11/05 追記)
Xcode 4.2では設定する箇所が変わりましたので新しく解説を書きました。

URL schemeを使ってアプリを起動する(Xcode 4.2の場合) - 強火で進め
http://d.hatena.ne.jp/nakamura001/20111105/1320501005

(追記ここまで)

iPhoneではURL schemeを使ってアプリを起動(同時に引数を渡すことも可能)することができます。

公式のドキュメントはこちらになります。

iOS Application Programming Guide: Implementing Common Application Behaviors
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StandardBehaviors/StandardBehaviors.html#//apple_ref/doc/uid/TP40007072-CH4-SW50

URL schemeに対応したアプリを起動

ここでは例として無料のアプリでURL schemeに対応しているWikiamoを例に解説をします。実機でテストする場合はこちらからインストールしておいて下さい。

WikiamoWikipediaを閲覧できるアプリです。URL schemeの記述についてはこちらに説明が有ります。

Wikiamo 1.3 リリース - Windchase
http://d.hatena.ne.jp/Psychs/20081110/1226267064

例として「dog」のページを開く場合のプログラムは以下の様になります。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"wikiamo://en.wikipedia.org/wiki/dog"]];

メールにて以下のURLをiPhone送り、それをクリックして起動テストをすることも可能です。
※ここではURLを <> で挟んでいますがこれを省略するとURLとして扱われないので常に付ける様にして下さい。

<wikiamo://en.wikipedia.org/wiki/dog>

(2011/07/06 追記)
現在では <> で挟んでもURLとして扱われなくなったみたいです。
(追記ここまで)

URL schemeに対応したアプリを作る

次にURL schemeに対応したアプリを作る方法を解説します。

(2011/07/06 修正&追記)
まずはplistファイルを表示している画面で右クリック、メニューの中から「Show Raw Keys/Values」をクリック。

次に以下の様な構成で「CFBundleURLTypes」のデータを作成します。「Item 0」のValueTypeはDictonary、「CFBundleURLSchemes」のValueTypeはArrayに成ります。

なお、 com.example.test と test については仮のものです。実際に使用する場合には値を変更して下さい。

定義は複数記述する事も可能です。

(修正&追記ここまで)

あまり変更することは無いと思いますけどプロダクト名が変更される可能性を考えると以下の様に記述した方が良いかもしれません。

URL schemeでアプリが呼ばれたときにアプリ側には application:handleOpenURL: というメソッドが呼ばれます。このメソッドの中でQuery(引数)を処理してアプリの動作に反映させます。

サンプルとしてメソッドが呼ばれたときのURL情報をアラート表示するアプリをこちらに作成しました。

主なプログラムは以下となります。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    NSString* msg = [NSString stringWithFormat:@"[URL]%@\n[schame]%@\n[Query]%@", 
                     [url absoluteString], [url scheme], [url query]];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"debug"
                                                    message:msg
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil, nil];
    [alert show]; 
    [alert release];
    
    return YES;
}

プログラムを呼ぶURL schemeの記述は Info.plist に設定した「URL identifier」「URL SchemesのItem」を使用し、

[URL SchemesのItem]://[URL identifier]?[Query(引数)]

の形になります。実際のデータを当てはめたものはこちら

Scheme://Scheme.yourcompany.com?a=1&b=2&c=3

実際に呼び出してみる場合は Wikiamo の場合と同様な以下のプログラムを実行しても良いのですが

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"Scheme://Scheme.yourcompany.com?a=1&b=2&c=3"]];

メールの場合はこうなります。

<Scheme://Scheme.yourcompany.com?a=1&b=2&c=3>

今回の解説ではQueryを a=1&b=2&c=3 という形式を使用していますが後でアプリ側で分割することを考えると Wikiamo の様に / を使った形式にした方が良いと思います。

<Scheme://Scheme.yourcompany.com/a/1/b/2/c/3>

※この場合、 [url query] に値は無いので [url absoluteString] の文字列を / で分割したものを使用することになります。

(2010/07/24 追記)
URL schemeを使っているアプリの情報をまとめているサイトが登場しました。これはありがたい。

Home - handleOpenURL:
http://handleopenurl.com/

(2011/10/09 追記)
URL schemeは使用して問題無い機能のみで使用しないと問題になる場合が有ります。

その辺りについての解説はこちらのサイトの「セキュリティ」の項目が詳しいです。一読をお勧めします。

さふ開発日記: iOSで独自カスタムURLスキームを設定する方法について
http://safx-dev.blogspot.com/2010/10/iosurl.html