【ios】Universal Linksを実装する - 実装方法

はじめに

前回書いた概要の続きです。

手順としては以下

Apple Developer

・「Identifiers」の「App IDs」より「Associated Domains」がEnabledになっていることを確認(または設定)
その際に、アプリの「ID」と「Prefix」もあとで使うのでメモしておく

※ここでは以下としておく
ID: jp.example.UniversalLinks
Prefix: AAAAAAAAAA

pcでの作業

・「apple-app-site-association」を作ってSSL対応のwebサーバーにアップロード

xcodeでの作業

・プロジェクトの「Capabilities」の「Associated Domains」を設定
・Universal Linksからアプリが起動されたときの処理を実装(urlスキームとにてる)

apple-app-site-associationを作ってSSL対応のwebサーバにアップロード

SafariからHandoffでiOSアプリを起動する
こちらのサイトでやりかたがのっていました(そのままです)


キーチェーンアクセスを開いて、「iPhone Developer: *****」を右クリック
→「iPhone Developer: *****」を書き出すで「個人情報交換(.p12)」形式で保存
→「dist.key」とする

ターミナル作業

> openssl pkcs12 -in dist.p12 -out dist.key -nocerts
> openssl pkcs12 -in dist.p12 -out dist.pem -nodes -clcerts -nokeys

> ls
dist.key dist.p12 dist.pem

json.txt

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "AAAAAAAAAA.jp.example.UniversalLinks", // 上でメモした「Prefix」と「ID」を.(ピリオド)でつなげたもの
        "paths": [
                "*",                  // 全許可(ドメイン以下へアクセスされるとアプリが起動される)
                "/sample/*",    // 特定のurlだけでアプリ起動する場合には、個別に指定
                "/sample2/*",
        ]
      }
    ]
  }
}

apple-app-site-association

> 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」が出来上がったのでコレをSSL対応のwebサーバーのドキュメントルートにアップロード
たとえば、「https://***.github.io/apple-app-site-association」でこのファイルにアクセス可能な状態となります。
アプリインストール(またはアップデート)時にアプリがこのファイルをダウンロードしにくるようです。

ちなみに、自己証明書(オレオレ証明書)のSSLだと上手く動きませんでした。
SSL対応してて自由に使えるサーバがなかったので、今回はGitHubの「GitHub Pages」を使いました。

xcodeでの作業

今回は「***.github.io」に「apple-app-site-association」を置いたので以下の2行を追加

applinks:*****.github.io
webcredentials:*****.github.io

f:id:yoppy0066:20151205111036p:plain
こんな感じになります


で、最後にAppDelegate.swifで起動されたときの挙動を実装します
AppDelegate.swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    ・・・

    func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
        if let url = userActivity.webpageURL {
            // urlが取得できる
        }
        return true
    }

    ・・・

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        ・・・

        // ユニバーサルリンクから起動
        if let activityDic = launchOptions?[UIApplicationLaunchOptionsUserActivityDictionaryKey] as? NSDictionary {
            if let userActivity = activityDic.valueForKey("UIApplicationLaunchOptionsUserActivityKey") as? NSUserActivity {
                if let url = userActivity.webpageURL {
                    // urlが取得できる
                }
            }
        }
    }


「***.entitlements」というファイルが出来ているので、これを選択して画面右の「Target Membership」の部分にチェックをつけてビルドします
f:id:yoppy0066:20151205112137p:plain

さいごに

この作業でマルマル2日間くらいかかったかも、、、自分がハマった点は以下

・オレオレSSLでは動かない(設定とかで動く?)
Apple DeveloperのAssociated DomainsがEnabledになってなかった
・ビルドの際に「***.entitlements」の「Target Membership」にチェックが付いてなかった

以上です