強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2009年03月05日

[]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」をクリック。

f:id:nakamura001:20110706011654p:image

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

f:id:nakamura001:20110706011655p:image

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

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

f:id:nakamura001:20110706011653p:image

(修正&追記ここまで)

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

f:id:nakamura001:20090306002126p:image

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

通りすがり通りすがり 2009/03/12 01:14 「チャトコ」というircクライアントアプリが対応しているようです。正確な書き方は忘れましたが、"irc://サーバ名/ルーム名"のような指定方法です。
同じ作者の方が「ぁーてぃぷ」というURL呼び出し用テストツールも公開しています。

nakamura001nakamura001 2009/03/14 22:42 情報ありがとうございます。

他にもいくつかのアプリの情報を他の方から頂いたので時間を見つけて
情報を追加させて頂きます。

notoroidnotoroid 2010/09/10 02:08 内容拝見させていただきました。URL identifier は識別用のもので、URLOPEN様に必須では無いと見受けましたがいかがでしょう?

nakamura001nakamura001 2010/09/10 12:12 自分が試したときも URL identifier は含まれていない場合でも動作には問題は有りませんでした。

しかし、この部分を利用して将来的に同じURL Schemeが複数登録されていた時に使用する起動するアプリを選択するダイアログなどURL identifierを利用した機能がこの先追加されるかも?と考え、自分は常に設定する様にしています。

とおりすがりとおりすがり 2011/10/25 02:31 はじめまして。サンプルコードでは、バックグラウンドで起動されている場合は、正常に動作しますが、起動されておらず、新規起動の場合は、クラッシュしますよね?何か解決策はあるのでしょうか?

nakamura001nakamura001 2011/11/05 22:29 返信が遅くなって申し訳ありません。

こちらで試してみたのですがこちらでは特に新規起動時にクラッシュするような事は有りませんでした。症状が再現可能なシンプルなサンプルなどをどこかにアップして頂く事は可能でしょうか?

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。