universal link
TRANSCRIPT
Universal Link2016/04/20@TachibanaKaoru
自己紹介渋谷のVOYAGE GROUPでiOSエンジニアをしています。Twitter/Vainglory : @TachibanaKaoruBlog : http://www.toyship.org/Bouldering : 4級朝時間.jpというアプリをだしてます。
Universal Linkとはfrom iOS9
» 自分のアプリや他のアプリを起動するスキーム。
» iOS内部の(設定した)URL Linkからアプリを起動することができる。
» 今までのカスタムURLスキームをおきかえる機能。
» URL Schemeの場合にはそれぞれのアプリが好きなものを設定できるので、アプリ間の重複の危険性があったが、Universal Linkの場合には、Domain名に依存するため、一意性が担保できる。
Universal Link
from Memo
Universal Link
from Mail
Universal Link
アプリがインストールされている場合、アプリで開く。
Universal Link
アプリがインストールされていない場合、Mobile Safariで開く。
他のアプリからの Universal Link» openURLで起動した場合には、Universal Linkが有効になります。
» ただし、urlを開く際にSFSafariViewController、WKWebView、UIWebViewを使うとUniversal Linkは無効になります。
» 意識の高いアプリはだめ。
自分のアプリからの Universal Link自分のアプリからはopenURLをしてもUniversal Linkが有効になりません。(Mobile Safariで開く)
Mobile Safariから» Mobile Safariのアドレスバーに直接URLを入力した場合や、Mobile
Safari内のリンクから移動した場合にはUniversal Linkはききません。
» Googleなどの検索結果からはUniversal Linkが有効になります。
ユーザーの選択を保存» アプリで開くか、Mobile Safariで開くか選択できる機能がある。
ユーザーの選択を保存Mobile SafariでUniversal Link対応のリンクを検索結果に表示してみる。
ユーザーの選択を保存一旦はUniversal Linkとしてアプリで開かれるが、右上にSafariへのリンクを表示する。
ユーザーの選択を保存Safariへのリンクを選択するとSafariで開き、以後はSafariで開くようになる。
Smart App Bannerとの違い» Universal Linkは、Smart App Bannerとは目的が異なるため、両方実装する必要があります。
» Smart App Bannerでは、アプリがインストールされていたらアプリが起動され、アプリがインストールされていなかったらApp Storeが起動する。
<meta name="apple-itunes-app" content="app-id=400435286, app-argument=https://asajikan.jp/topics/">
Smart App BannerとUniversal Linkの隠れた関係» Smart App Bannerのcontentのapp-argument指定がUniversal
Linkに対応しているかどうかでUIが変わる。(下記のリンクをMobile Safariでチェックしてみてください)
» https://asajikan.jp/ (Universal Link対応)
» https://asajikan.jp/topics/ (Universal Link非対応)
Smart App Banner
Universal Link対応の場合、アプリでUniversal Linkとして開く。(Banner小さめ)
Smart App Banner
Universal Link対応の場合、アプリのトップを開く。(Banner大きめ)
実装方法» Server
» Client
実装方法 (Server)» server root(/)に apple-app-site-association という名称でjsonフォーマットの設定ファイルを置く。
» (このファイルに署名をかける必要があるという情報があったけど、かける必要はありません。)
» iOS9.3.1以上では、apple-app-site-associationのファイルサイズは128KBに制限されてます。(9.3で発生していたクラッシュの原因だったらしい)
apple-app-site-association format
» Bundle IdentifierとUniversal Linkに対応させたいpathを記述。{ "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] }}
実装方法 (Server)» 設定ファイルの置き場所は、9.3から /.well-known/ もサポートするようになりました。
» Technical Q&A QA1919
» Incoming requests for /.well-known/apple-app-site-association filehttps://developer.apple.com/library/ios/qa/qa1919/index.html#//appleref/doc/uid/DTS40016874
apple-app-site-association formatasajikan.jpの現在の設定{ "applinks": { "apps": [], "details": [ { "appID": "94VJUJ8B7P.jp.asajikan.www", "paths": [ "/", "/article/*", "/recipe/*" ] } ] }}
apple-app-site-association format
» 実は、今のフォーマット以前に使われていた古いフォーマットもあります。(そのうち無効になると思うので使わないほうがよい)
{ "applinks": { "apps": [], "details": { "94VJUJ8B7P.jp.asajikan.www": { "paths": [ "/", "/article/*", "/recipe/*" ] } } }}
apple-app-site-association format
» ?が一文字、*が複数文字
» NOTを使って対象外pathの設定もできるが、古いiOSでは非対応(9.2.1ではOK、9.1ではNG)
» "paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/", "/videos/wwdc/201?/"]
» こうすると、wwdc/201*/以下のファイルはwwdc/2010をのぞいてUniversal Link対応となる。
App Search API Validation Tool
» formatのvalidation checkをすることができます。
» https://search.developer.apple.com/appsearch-validation-tool
実装方法 (Client)» ProjectのCapabilityにAssociated Domainsを設定
» 例)Domains: applinks:asajikan.jp
実装方法 (Client)» 起動された時のハンドリング処理
» UIApplicationDelegate
» application:continueUserActivity:restorationHandler:
» (Core SearchやHandoffによる起動ハンドリングする)
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool{ if userActivity.activityType == "com.apple.corespotlightitem" { // Core Searchの処理を記述 } else if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
let url : NSURL? = userActivity.webpageURL // Universal Linkの処理を記述
} return true }
まとめ» Web Site連携アプリはUniversal Link導入すべき
» Smart App Bannerも連携させるとベター
» Universal Link対応pathは細かく設定できるが、iOSのバージョンによって動作が異なることに注意