Upgrade to Pro — share decks privately, control downloads, hide ads and more …

(Deep|Web) Link support with expo-router

(Deep|Web) Link support with expo-router

Shinnosuke Yamamoto

October 04, 2024
Tweet

More Decks by Shinnosuke Yamamoto

Other Decks in Programming

Transcript

  1. © JMDC Inc. ࣗݾ঺հ • @mrtry • JMDC, Inc /

    Ventus, Inc • Engineer (Mobile) • Engineering Manager • 高 専卒 / 現放送 大 学 生 • 心 理学まわりの単位を取ってる • メタ認知システムが 大 好き
  2. © JMDC Inc. (Deep|Web) Link Deep Link • ΞϓϦ͝ͱʹURL SchemeΛఆΊɺͦͷSchemeͷࢦఆ͢Δ͜ͱͰΞϓϦΛىಈͰ

    ͖ΔΑ͏ʹ͢Δ࢓૊Έ Web Link • ΞϓϦΛΠϯετʔϧͨ͠ঢ়ଶͰWebαΠτΛ։͘ͱɺΞϓϦ͕։͔ΕΔ࢓૊Έ 5
  3. © JMDC Inc. 6 ໊শ URL Scheme ྫ ิ଍ Deep

    Link [೚ҙจࣈྻ]:// examble-app:// Android/iOSͲͪΒ΋ڞ ௨໊শ native deep-link [೚ҙจࣈྻ]:// examble-app:// ExpoͷcontextͰͷDeep Link Web Link https://... https://example- site.com AndroidͷυΩϡϝϯτ Ͱͪΐͬͱग़ͯ͘Δ Universal Link https://... https://example- site.com iOSͷcontextͰͷWeb Link App Link https://... https://example- site.com AndroidͷcontextͰͷ Web Link web deep-links https://... https://example- site.com ExpoͷcontextͰͷWeb Link
  4. © JMDC Inc. Ͳ͏࣮૷͢Δͷ͔ 1 . Webサイトに設定ファイルをアップロードしておく 2 . app.config.tsに設定を追加する

    3 . 「WebサイトのURLに対応するアプリの画 面 を開く」処理を実装する 1 1
  5. © JMDC Inc. apple-app-site-association iOSは設定確認が 面 倒なので注意 • 端末でDev modeを有効にする必要がある

    • TN 3 1 5 5 - 日 本語ドキュメント - Apple Developer • 設定ファイルがCDNにcacheされる必要があるし、24hかかる • iOS 1 4 でUniversal Links対応することになった 人 が 見 る記事 #Swift - Qiita • 待ちたくない場合は、app.config.tsでbypassする設定が必要 1 5
  6. © JMDC Inc. 2 - 1 . app.config.tsΛॻ͖׵͑Δ ios /

    android に設定を追記する 2 0
  7. © JMDC Inc. 2 - 2 . AppleͷαΠτͰɺAssociate DomainΛ༗ޮʹ͢Δ ҎԼͷهࣄ͕ஸೡͳͷͰಡΉͱ͍͍

    • Associate DomainΛ༗ޮԽ | React Native(Expo)ʹUniversal LinksΛ࣮૷ͯ͠ɺWeb ͔ΒΞϓϦʹࣗಈભҠͤ͞Δʂʲલฤʳ 2 1
  8. © JMDC Inc. 2 - 3 . rebuild͢Δ • app.config.tsͷมߋ಺༰͸ɺnative

    layerͷมߋͳͷͰɺrebuild͢Δ • Provisioning Profileͷ࠶ੜ੒΋ඞཁͳͨΊɺ —non-intaractive ͳ͠Ͱ࣮ߦߦ͢Δ • Provisioning Profile͕Α͘Θ͔Βͳ͔ͬͨΒ ҎલͷొஃεϥΠυΛݟ͍ͯͩ͘͞ 2 2
  9. © JMDC Inc. ʮWebαΠτͷURLʹରԠ͢ΔΞϓϦͷը໘Λ։͘ʯॲཧΛ࣮૷͢Δ Defaultのnavigation handlingをOverrideする必要がある • 2.までやると、サイト開こうとするとアプリは起動する • expo-routerのdefault:

    「Webサイトのpathに合わせて画 面 遷移する」 • 例: https://example.com/notification/ 1 2 3 4 5 を開こうとすると example://notification/ 1 2 3 4 5 が開かれる • defaultのnavigationだと、アプリにとって不都合なことが多い • WebとモバイルアプリのURL設計がズレていることは多分にあるため 2 4
  10. © JMDC Inc. +native-intent.tsx Customizing links - Expo Documentation redirectSystemPath():

    • URLでアプリを起動したときに呼ばれる • この関数から返されたpathを元にexpo-routerが画 面 遷移してくれる 2 5
  11. © JMDC Inc. Tips: Query Parameterͷencoder/decoderΛ࣮૷͠ͱ͍ͨ΄͏͕͍͍ • 一 般的にQuery Parameterはdecodeして渡すもの

    • useLocalSearchParamsは、値をdecodeしてから使うようにしたほうがいい • WebView Screenに、外部からURLをQueryParameterで渡す時などに忘れがち 2 8
  12. © JMDC Inc. Tips: ೝূ͕͋ΔΞϓϦέʔγϣϯͰͷઃܭ • 認証フローがExpoのドキュメント通りに組んであるとラク • Authentication in

    Expo Router - Expo Documentation • 初 手 は認証済みのトップページに 飛 ばし、_layoutで(Web|Deep) Linkのhandlingをす ると良さそう • ログインしてなかったユーザーが、ログインできたときに、 (Web|Deep) Linkで開こうとしてたページを開いてくれて親切 • 起動時のURLは Linking.getInitialURL() で取得できる 3 0
  13. © JMDC Inc. Tips: ೝূ͕͋ΔΞϓϦέʔγϣϯͰͷઃܭ 意図しないApp Linkを雑に /webview で開くと困ることがある •

    認証済みのRoutingに /webview を設置してあるという前提 • 意図しないWeb Linkを雑に /webview に投げつけると、未認証時にURLをアプリで開けないということが起こる • 「新規会員登録」「問い合わせ」「パスワードリセット」などのURLを開こうとすると、未認証トップに 飛 んでしまう • 一 応、URLをブラウザにURLを直貼りするとブラウザで回遊できるが、リテラシーが試される • Routing処理と別で「特定のpathが来たら、 WebBrowser で起動する」という処理を 入 れたほうが良さそう • ただし、雑にWebBrowserを使うと、Androidでバグるので次のTipsを参照 3 1
  14. © JMDC Inc. Tips: Web Link対応したAndroidアプリͰWebBrowserΛ࢖͏࣌ͷ஫ҙ • AndroidのWeb Linkを設定し、WebBrowserで開こうとすると、無限ループする •

    Web → +native-intent.tsx → WebBrowserがWeb開く → Webからアプリに 飛 ばされる → … • そのため「このURLはWebBrowserで開け」と明 示 的に指定してやる必要がある 3 2