Posted at
CocoaDay 23

[cocoa][swift]Universal Links

以前、組み込みWebブラウザの会社に勤めていた関係で、独自の機能の呼び出しにURLスキームを利用する方法はよ馴染みがある。iOSでも同様にCustom URL Schemeを利用してアプリケーションを呼び出すことができるが、この方法は、スキームが重複と、意図しない外部サービスから呼べるという問題がある。

そこで登場したのがUniversal Links。

ただ、Custom URL Schemeの知識は必要だと思うので、まずは説明する。


Custom URL Scheme

形式は、以下のとおり。

スキーム名://〜

スキーム名は、重複を避けるため、ドメイン名を逆から並べる、バンドルIDから派生した文字列がオススメされている。例えば、バンドルIDがcom.example.editorのアプリケーションの一覧画面を表示するスキーム名は、com.example.editor.listという感じにする。

Custom URL Schemeは、Info.plistに定義するが、Xcodeの画面から設定する方法もある。

まずは、Info.plistでの設定箇所を説明する。


  • URL typesの

    • Item nに


      • URL identifierにユニークな識別子を設定。バンドルIDから発生した文字列がオススメ。

      • URL Schemesに

        • Item nに、スキーム名を設定。複数設定可能。






Xcodeの画面から設定する場合は、TARGETS > Info > URL Types のIdentifierに識別子をURL Schemesにスキーム名を設定する。

iOS9以降では、安全性の観点からLSApplicationQueriesSchemesを設定するなどの対応が必要となる。


Universal Links

iOS9以降から利用可能。なので、それより前のバージョンをサポートする場合は、Custom URL Schemeの対応も必要。

対応手順は以下のとおり。

Webサーバのルートに、関連付けファイル (apple-app-site-association) を配置する。

{

"applinks": {
"apps": [],
"details": {
"チームID.com.example.アプリ名(バンドルID)": {
"paths":[ "*" ]
}
}
}
}

ファイル名は apple-app-site-association。

Content-Typeは application/json。

Appleの資料では、署名がある場合のContent-Typeは、application/pkcs7-mimeという説明があるが、Webサーバとの通信はHTTPSが推奨されているので署名されてなくても、なので、訳あってHTTPの場合の対応のようだ。

ちなみに、署名する場合は、以下の感じのコマンドとなる。

$ openssl smime \

-sign \
-nodetach \
-in "unsigned.json" \
-out "apple-app-site-association" \
-outform DER \
-inkey "private-key.pem" \
-signer "certificate.pem"

アプリケーション側の設定は以下のとおり。

XcodeのTARGETS > Capabilities > Associated Domains をONにして、Domainsにサーバのドメイン名を設定する。

これで、App ConnectのAppIDsが、この内容で更新されるはずだが、されていなかったら手動で変更する。

Universal Linksには、Universal Linksの設定が正しいかどうかを確認するサイトが用意されている。


  • App Search API Validation Tool
    https://search.developer.apple.com/appsearch-validation-tool/

Universal Linksからの呼び出しは、UIApplicationDelegateの、以下のメソッドで検出できる。

optional func application(_ application: UIApplication, 

continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool

【関連情報】

Cocoa Advent Calendar 2018


Cocoa.swift 2019-01


Cocoa.swift


Cocoa勉強会 関東


Cocoa練習帳


Qiita