x-callback-url とはURLスキームを利用したアプリ間連携の仕組み。他アプリを呼び出すだけでなく、その名(コールバック)の通り呼び出し元で結果を受け取るまでの一連の動作を定めている。
現在は 1.0 DRAFT Specx-callback-url | x-callback-url が公開されている。
この仕様ではURLスキームの書き方を定義している。書式はこんな感じ。
targetapp://x-callback-url/updateStatus? x-source=SourceApp& text=hello
パラメータは他に x-cancel などあり、成功や失敗に応じたコールバック用URLを指定することができる。
targetapp://x-callback-url/translate? x-success=sourceapp://x-callback-url/1.0/acceptTranslation& x-source=SourceApp& x-error=sourceapp://x-callback-url/1.0/translationError& word=Hello& language=Spanish
いくつかのメジャーなアプリがこの x-callback-url に対応している。
Appsx-callback-url | x-callback-url
例えば Chrome では専用ページが用意されていて、利用可能なパラメータやその意味が解説されている。
パラメータ
url: (required) the URL to open
x-success: (optional) the URL to call for the return when the operation completes successfully
x-source: (optional; required if x-success is specified): the application name to where the calling app returns
create-new-tab: (optional) forces the creation of a new tab in the calling app
呼び出し例
googlechrome-x-callback://x-callback-url/open/?url=http%3A%2F%2Fwww.google.com
で、本題はその x-callback-url が簡単に扱えるライブラリの紹介。
呼び出しはこんな感じ。
IACClient *client = [IACClient clientWithURLScheme:@"appscheme"]; [client performAction@"action" parameters:@{@"param1": value1, @"param2": value2}];自分でURLスキームを組み立てる必要は無い。
コールバック処理は blocksで書ける。
IACClient *client = [IACClient clientWithURLScheme:@"appscheme"]; [client performAction:@"action" parameters:@{@"param1": value1, @"param2": value2} onSuccess:^(NSDictionary *resultParams){ NSLog(@"The app response was: %@", resultParams) } onFailure:^(NSError *error){ NSLog(@"ERROR: %@", [error localizedDescription]); } ];
Chromeと連携するサンプルがあったので試してみた。起動するとUIWebViewでページが表示される。
"Open in Chrome" を押すと Chromeが起動する。ここまでは普通のアプリ呼び出し。
よくみると左上にサンプルアプリ名の入ったボタン(IACCrhome)が表示されている(ボタン隠れてるけど)。
これを押すとサンプルアプリへ戻る。
サンプルではChrome呼び出しに特化した IACClientのSABクラスが用意されてた。
@interface GoogleChromeIACClient : IACClient - (void)openURL:(NSString*)url; - (void)openNewTabWithURL:(NSString*)url; - (void)openURL:(NSString*)url onSuccess:(void(^)(void))onSuccess onFailure:(void(^)(NSError*))onError; - (void)openNewTabWithURL:(NSString*)url onSuccess:(void(^)(void))onSuccess onFailure:(void(^)(NSError*))onError; @end今後、対応アプリのこういったサブクラスが一緒に提供されると便利になりそう。
- - - -
単純なしくみだがアプリ間連携が非力なiOSではこういう標準的な取り組みは重要。特にOpenINやUIActivityControllerではコールバックを用意していないので、外部アプリでの加工結果を利用するような用途に使える。