iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
以前、組み込みWebブラウザの会社に勤めていた関係で、独自の機能の呼び出しにURLスキームを利用する方法はよ馴染みがある。iOSでも同様にCustom URL Schemeを利用してアプリケーションを呼び出すことができるが、この方法は、スキームが重複と、意図しない外部サービスから呼べるという問題がある。
そこで登場したのがUniversal Links。
ただ、Custom URL Schemeの知識は必要だと思うので、まずは説明する。
スキーム名は、重複を避けるため、ドメイン名を逆から並べる、バンドルIDから派生した文字列がオススメされている。例えば、バンドルIDがcom.example.editorのアプリケーションの一覧画面を表示するスキーム名は、com.example.editor.listという感じにする。
Custom URL Schemeは、Info.plistに定義するが、Xcodeの画面から設定する方法もある。
まずは、Info.plistでの設定箇所を説明する。
Xcodeの画面から設定する場合は、TARGETS > Info > URL Types のIdentifierに識別子をURL Schemesにスキーム名を設定する。
iOS9以降では、安全性の観点からLSApplicationQueriesSchemesを設定するなどの対応が必要となる。
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の設定が正しいかどうかを確認するサイトが用意されている。
Universal Linksからの呼び出しは、UIApplicationDelegateの、以下のメソッドで検出できる。
optional func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool