カスタム URL スキームを実装する : Objective-C プログラミング

SPECIAL


カスタム URL スキームを実装する

あるアプリが別のアプリを呼び出す方法にURL スキームというものがあります。

たとえば Web サイトを開くときに "http://xxx.xxx.xx/f/p1.html?n1=v1&n2=v2" のような URL が使われますが、カスタム URL スキームを使うと、これのプロトコル("http")の部分に独自の文字列を指定して、外から自分のアプリを呼び出してもらえるようになります。

 

このとき、URL の後の "://" に続いて、ホスト名("xxx.xxx.xx")やパス("/f/p1.html")やクエリ("n1=v1&n2=v2")という形で受け取ることができます。

ホスト名以降をどのような書式にするかは自分のアプリの方で決めて、それを他のアプリのプログラマーに使ってもらう形になります。

カスタム URL スキームを登録する

自分のアプリ用の URL スキームを登録するには、自分のアプリでそれを設定する必要があります。

設定は、ターゲットの Info 設定にある "URL Types" で行います。

ここに、このアプリが扱う URL スキームを必要な数だけ追加します。

設定項目は、次のようになっています。

Identifier この URL スキームに付ける識別子です。自分が所有するドメインを使った文字列を逆順に並べて指定することが推奨されています。
URL Schemes ここに指定した文字列:// という URL スキームで、このアプリを呼び出せるようにします。複数の文字列を一括登録したい場合は、カンマ区切りで指定します。
Icon この URL スキームにアイコンを指定したいときに使用します。設定しなくて大丈夫です。
Role この URL スキームの扱いを指定します。参照 (Viewer)、エディタ (Editor)、指定なし (None) から選べます。受け取った URL をスキームを使ってこのアプリがどんな振る舞いをするかを、目安程度に設定しておけば大丈夫です。

このうちの Icon と Role については、このスキームのアイコンや用途が何かを、外部アプリが調べられるように Info.plist に書いておくだけのようで、これらの設定によって何か制御が変わることはない様子です。

逆に言うと、気になるアプリの Info.plist を覗くことで、そのアプリが持っている URL スキーム名などの概要を見ることができます。

カスタム URL スキームを受け取ったときの処理を実装する

アプリにカスタム URL スキームを設定したら、それを外部アプリが呼び出したときに、受け取って処理をするコードを実装します。

外部アプリがこのアプリのカスタム URL スキームを呼び出すと、UIApplicationDelegate の次のデリゲートメソッドがメインスレッドで呼び出されます。

  1. -application:didFinishLaunchingWithOptions:
    (アプリが起動していなかった場合だけ)
  2. -application:openURL:sourceApplication:annotation:

カスタム URL スキームの処理を実装するには、特にこの -application:openURL:sourceApplication:annotation: に必要なコードを実装します。

- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation

{

}

具体的には、外部のアプリが指定した URL が openURL の引数に渡されてくるので、それを元に任意の処理を記載します。

戻り値は BOOL 型を採りますが、渡された URL スキームを正しく処理できた場合に YES を、URL スキームを開けなかった場合に NO を返すようにします。

 

なお、sourceApplication には呼び出し元のアプリの Bundle Identifier も渡されてきます。annotation には、呼び出し元から何らかの プロパティリストオブジェクト が情報として渡されることがあるそうです。

渡されたカスタム URL スキームを解析する方法

http のような、"スキーム://ホスト/パス/パス?名前=値&名前=値" という書式の URL を扱う場合、NSURL を使うと URL スキームの解析がだいぶ楽になります。

これについては NSURL のクエリ文字列を解析する で紹介しています。

カスタム URL スキームが他のアプリとかぶった場合

独自に定義したカスタム URL スキームが既に他のアプリで定義されていた場合も考えられます。

そのようなとき、アップルが定義したものとかぶった場合は、アップルのアプリが優先して開かれるそうです。それ以外のアプリで衝突した場合には、どのアプリが開かれるかは決まっていないようです。

[ もどる ]