狠狠撸

狠狠撸Share a Scribd company logo
Universal Links対応をした話
iOS 10時代のDeep Link技術
2017/5/24
potatotips #40 @ Retty株式会社
iOS/Android開発Tips共有会
行木 千春
自己紹介
行木 千春(なめき ちはる)
昔 macOS向けアプリ?ミドルウェア開発者 → 今 iOSアプリ開発者
株式会社サイバーエージェント
Amebaアプリ担当
アメブロの投稿?閲覧アプリです!
株式会社 nana music
音楽コラボレーションアプリ nana
音声エンジン製作者
音声処理技術が好きです
モチベーション
? Universal LinksはiOS 9以降の機能
? iOS 10が普及した今、サービスに導入しやすくなった
? 実際に対応して得られた知見(発表当時の情報からのアップデー
トなど)をまとめる
おさらい
~ ユーザ視点で見たUniversal Links ~
HTTPまたはHTTPSのリンクをタップした時に
ドメインに対応するアプリが起動する
Universal Links経由でアプリが開いた時のステータスバー
Safariで表示
(今後もSafariで開くようになる)遷移元アプリに戻る
Safariで表示時に下に引っ張ると
アプリで開くためのバーが出現
「開く」を選ぶと再びアプリで開くようになる
この手順により、アプリで開くかSafariで開くかはユーザが選択可能
(正直わかりにくい?)
アプリが起動する条件
? ユーザがSafariで開くことを選択していない
? iOS 9以降
? アプリがインストールされている
未インストールの場合、操作中のアプリでそのまま遷移
ストアが立ちあがったりはしない
? 同一ドメイン内の遷移ではない
厳密にはスキーマが異なる場合は起動した
e.g.) http://hoge.com/ から https://hoge.com/ への遷移
? Entitlement の Associated Domainsにapplinks:をつけてドメインを記載
e.g. applinks:example.com
? Universal Links経由でアプリが開かれた時に呼ばれるメソッドを実装
? 扱えないURLはopen(_:options:completionHandler:)で開き直す
アプリが立ちあがった後、さらに別アプリが起動するのでUX上いまいち。
なるべく発生しないようにしたい。
おさらい
~ アプリ側の対応 ~
func application(application: UIApplication,
continueUserActivity userActivity: NSUserActivity,
restorationHandler: ([AnyObject]?) -> Void) -> Bool {}
? AASA (apple-app-site-association) ファイルを配置
? ルートまたは .well-known サブディレクトリ配下に置く
? HTTPSで直接アクセスできるようにする
HTTPではダメ, リダイレクトもNG
? アプリのインストール、またはアップデート時にOSに取得される
サーバエラー(500系)の場合、3時間後に再取得
おさらい
~ サーバ側の対応 ~
AASA (apple-app-site-association) ファイル
{
"applinks": {
"apps": [],
"details": [
{
"appID": "XXXXXXXXXX.jp.co.hoge.AppName",
"paths": [
"NOT /_*",
"*"
]
},
{
"appID": "YYYYYYYYYY.jp.co.choge.AppName-ota",
"paths": [
"NOT /_*",
"*"
]
}
]
}
}
AppIDのPrefixを指定
昔ながらのアプリでは
チームIDと異なるので注意
←
AASAファイルの記述方法
? detailsもpathも先頭から評価される
? マッチしたらそこで評価を終了
? 複数のアプリが記述 & インストールされていたら、先に書かれて
いる方が立ち上がる
? Pathのマッチングルール
? クエリやフラグメントは対象にならない
? ? … 任意の1文字 (/もOK)
? * … 任意の文字列(0文字でも/が混ざっていても良い)
? NOT はiOS 9.2以降
? 最後のスラッシュの有無はマッチングに寄与しなかった
解釈はOSバージョンに依存するので注意してテストする
func open(_ url: URL,
options: [String : Any] = [:],
completionHandler completion: ((Bool) -> Void)? = nil)
アプリ内からURLをUniversal Linksとして開くには
UIApplication の open() メソッドを使う
? 外部アプリで開けたかどうかの結果が取得できる
? 自分自身の対応ドメインのURLを渡すとSafariが起動する
iOS 10以降
iOS 9以前の open(_ : URL) -> Bool と比較すると
? 開けるURLのタイプをUniversal Linksのみに限定可
? 非同期になった
open()メソッドを呼ぶと
外部アプリで開く前に
確認ダイアログを出してくれるようになった
「アプリで開く」バー
? SafariのUI
? 表示はカスタマイズ不可
? 表示される条件
? 対応アプリをインストール済み
? 対応ドメインをSafariで開く設定にしている
? HTMLにはSmart App Bannerなどの記述は必要ない
推測:iOSが実際に何をしているか
? iOS端末上にドメイン - アプリのマッピング情報が存在
? アプリのインストール/アップデート時にマッピング情報を更新
? URLを開く際、URLのドメインに対応アプリが存在したらアプリ
で開く
ほぼ端末上の処理で成り立っている機能
iOS 9とiOS 10での挙動の違い
iOS 9
最初のリクエストがUniversal Linksのときのみアプリが起動する
iOS 10
リダイレクト先がUniversal Linksの場合もアプリが起動する
最初のリクエストとリダイレクト先がどちらもUniversal Linksだった場合、
application(application:continueUserActivity:restorationHandler:) が2回呼び出される
リダイレクト時の挙動が異なっていた
テスト方法(運用前)
? STGで技術検証
? 本番にAASAファイルを配置してテスト
STGのURLはGoogleなどにインデックスされていないため
ユーザ体験がどう変わるかの検証には本番を使う必要がある
? AASAファイルにはドメイン依存の情報がないため、STGと本番で
同じファイルを利用可能
? アプリの Associated Domains を環境によって書き換える
テスト方法(運用後)
ユーザ体験の検証のために本番のAASAファイルを更新?!
… するわけにはいかない
プロキシを利用するなどしてルーティングを工夫
?host
書き換え
proxy
本番
IP: xxxxxxx
社内からのみ見える
本番環境
運用上の課題
? 機能を切り戻したり、挙動を変更するには
アプリのアップデートが必要
AASAファイルを更新しても、アプリのアップデートのタイミングでしか取得しに来
てくれない
? アプリバージョンとAASAファイルの整合性の保ち方
? リファラなど流入元の情报が取得できないため、厂贰翱の観点で困る
ユーザの反応
? いきなりアプリが開くようになってうざい
? 元に戻したいという問い合わせが来た
→ 操作方法を案内
むやみにアプリが開くのはストレス
サービスの価値を本当に高められ
ユーザにも納得感のある場所で使わないといけない
Appendix: Custom URL Scheme is dead?
? URLが開けるかどうかを確認する canOpenURL() はiOS 9以降
info.plistにスキーマの記載が必要になった
? iOS 8以前は代わりに canOpenURL() の呼び出し回数が50回に制限されていた
? 実際にアプリを開く open() メソッドには制限がない
? open()メソッドが外部アプリで開く前に確認ダイアログを出してく
れるようになった
十分利用可能
カスタムスキーマ最大の問題点
アプリがインストールされていないと
Safariで「ページをひらけません」エラーが表示される
公開されているWeb面に使うのは厳しい
アプリ間遷移で利用する分には
open()メソッドでエラーハンドリングできるので良さそう
所感
便利そうだが制限が多く、使い所が難しい
ご静聴ありがとうございました
?
WWDC 2017に参加します
できたてのApple Parkに行ってみたい
告知:CyberAgentで前後にイベントを開催します
WWDC直前
Pre-WWDC Gathering
https://cyberagent.connpass.com/event/55235/
5/30 19:30~
渋谷プライムプラザ4F Creative Lounge
WWDC後
CA.swift #3 WWDC 2017 Reporting
6/19

More Related Content

Universal Links対応をした話