Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Universal Links対応をした話

3,159 views

Published on

2017/5/24 potatotips #40

Published in: Engineering
  • Be the first to comment

Universal Links対応をした話

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

×