Fork me on GitHub

サンプルコード

https://github.com/sonsongithub/HandoffSample

Safariから他のiOSデバイスのネイティブアプリケーションを起動する

例えば,Cookpadのようなサービスの場合,OSXのSafariでレシピを調べた後,その内容をiPadやiPhoneのCookpadアプリでそれを引き続き見たいというユースケースが考えられる. これを実現するのが,Safariでブラウジングしているサイトに応じて,iOSデバイスの特定のアプリケーションを起動するHandoffの機能だ. このためには,サイトとiOSのネイティブアプリケーションの両方に手を加える必要がある. 現状,このSafariからネイティブアプリケーションをキックするHandoffの仕組みの対象にOSXは含まれないようだ(つまりSafariからOSXのネイティブアプリケーションを起動する仕組みはないっぽい).

ネイティブアプリケーション

まず,iOSの”Certificates, Identifiers & Profiles“の”Identifiers”の”App IDs”のアプリケーションの設定で”Associated Domains”をEnabledにする. 次にXcodeのプロジェクトのCapabilitiesのAssociated Domainsに,iOSデバイスをキックしたいサイトのドメインを追加する. このとき,接頭辞として,activitycontinuation:を忘れないようにする.

image

これでネイティブ側の設定は完了する.

サーバサイド(@norio_nomuraのレポートより)

まず,起動するアプリケーションの識別子をリストにしたJSONを用意する. このとき,識別子に英数字10文字からなる開発者のチームID(例:123ABC456D)を追加する.

{
  "activitycontinuation":{
    "apps": [
      "YWBN8XTPBJ.jp.co.example.myApp",
      "YWBN8XTPBJ.jp.co.example.myOtherApp"
    ]
  }
}

そして,Handoffプログラミングガイドブックに載っている手順を参考にこのJSONファイルに署名を加えて,apple-app-site-associationというファイルを出力する. このファイルは,Associated Domainsで記述したドメインのルートパスに置いておく. このとき,スキーマがhttpsであることに留意する.

https://www.example.com/apple-app-site-association

さらにHandoffガイドブックは,このJSONファイルをiOSが内部的に持つ信頼する認証局リストに含まれる認証局が発行する証明書で署名するように指示している. このapple-app-site-associationは,テキストではなく,署名付きでアップロードしなければならないということだ. ただし,この署名は,JSONファイルを置くサーバのSSL通信時に利用する証明書IDと同一である必要性はないとしている. つまり,JSONファイルは,ホスティングサービスで提供されるサーバなどにも置けるということである.

認証局が発行する証明書を取得するとなるとまた骨が折れるが,つぶさに認証局リストを見ると,Apple自身が信頼する認証局に含まれている. iOSのデベロッパは,開発用の証明書を持っている・・・・ということでiOSの署名に使う証明書を使ってこのJSONファイルに署名を加えることができる. これを使った手順の例を以下に示す.

# キーチェーンから "iPhone Distribution: <Your name> (XXXXXXXXXX)" を dist.p12 として書き出す.
# 秘密鍵を作る
> openssl pkcs12 -in dist.p12 -out dist.key -nocerts
# 証明書を作る
> openssl pkcs12 -in dist.p12 -out dist.pem -nodes -clcerts -nokeys
# JSONファイルをテキストとして書き出す
> echo '{"activitycontinuation":{"apps":["YWBN8XTPBJ.com.example.myApp"]}}' > json.txt
# 署名する
> cat json.txt | openssl smime -sign -inkey dist.key -signer dist.pem -certfile dist.pem -noattr -nodetach -outform DER > apple-app-site-association

ここまでの作業で完成したapple-app-site-associationファイルをサーバにアップロードしよう.

注意点

筆者は,github.ioのホスティングを利用してテストを行った. 参考にされたい. ただし,Appleの資料では,apple-app-site-associationファイルのContent-Typeは,application/pkcs7-mimeでなければならないとあるが,github.ioはそのContent-Typeを返さない. しかし,いまのところ,Conttent-Typeは何でもいいようだが,この辺は,以後のバージョンアップ等で挙動が変わる可能性があるので留意されたい.

ここまでの作業の確認は,@norio_nomuraさんのお仕事でした. ありがとうございました.

Handoff

example.comドメインにHandoffのapple-app-site-associationファイルをアップロードしたとする. ここまで作業した状態で,OSXあるいはiOSのSafariでhttp://www.example.com/を閲覧すると,その他のデバイスにネイティブアプリケーションをキックするHandoffが通知されるはずだ. 動かない場合は,署名,通信,entitlement等,数多く設定要素があるので,一つずつ確認していくしかないと思う・・・.

WebサービスとiOSのネイティブアプリケーションがあるサービサーは必須機能だと筆者は考える. 今後,ぜひ大手のサービサーさんには,この機能をサポートしてもらいたいと思う.