Share
Embed
(Deep|Web) Link support with expo-router
Shinnosuke Yamamoto
October 04, 2024
Transcript
32 slides
-
expo-routerで (Deep|Web) Link対応 @mrtry 2 0 2 4 / 1
0 / 0 4 React Native Meetup -
© JMDC Inc. ࣗݾհ • @mrtry • JMDC, Inc /
Ventus, Inc • Engineer (Mobile) • Engineering Manager • 高 専卒 / 現放送 大 学 生 • 心 理学まわりの単位を取ってる • メタ認知システムが 大 好き -
© JMDC Inc. (Deep|Web) Link Deep Link • ΞϓϦ͝ͱʹURL SchemeΛఆΊɺͦͷSchemeͷࢦఆ͢Δ͜ͱͰΞϓϦΛىಈͰ
͖ΔΑ͏ʹ͢ΔΈ Web Link • ΞϓϦΛΠϯετʔϧͨ͠ঢ়ଶͰWebαΠτΛ։͘ͱɺΞϓϦ͕։͔ΕΔΈ 5 -
© 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 -
© JMDC Inc. Ͳ͏࣮͢Δͷ͔ • expo-routerΛར༻͍ͯ͠Δ߹ɺapp.config.tsͰschemeΛఆΊΔ͚ͩ • <scheme>://<dir-path>ͷࢦఆͰΞϓϦ͕ىಈ͢Δ • ྫ
• scheme: my-app • app/home/index.ts ͕͋Δ • Deep Link my-app://home ʹͳΔ 8 -
© JMDC Inc. Ͳ͏࣮͢Δͷ͔ 1 . Webサイトに設定ファイルをアップロードしておく 2 . app.config.tsに設定を追加する
3 . 「WebサイトのURLに対応するアプリの画 面 を開く」処理を実装する 1 1 -
© JMDC Inc. WebαΠτʹઃఆϑΝΠϧΛΞοϓϩʔυ͓ͯ͘͠ JSONΛɺWebαʔϏεͷυϝΠϯ͔ΒΞΫηεͰ͖ΔΑ͏ʹ͢Δ Android: asset-link.json • https://<domain-name>/.well-known/assetlinks.json ʹஔ͢Δ
iOS: apple-app-site-association • https://<domain-name>/.well-known/apple-app-site-association ʹஔ͢Δ 1 3 -
© 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 -
© JMDC Inc. app.config.tsに設定を追加する 1 . app.config.tsΛॻ͖͑Δ 2 . AppleͷαΠτͰɺAssociate
DomainΛ༗ޮʹ͢Δ 3 . rebuild͢Δ 1 9 -
© JMDC Inc. 2 - 1 . app.config.tsΛॻ͖͑Δ ios /
android に設定を追記する 2 0 -
© JMDC Inc. 2 - 2 . AppleͷαΠτͰɺAssociate DomainΛ༗ޮʹ͢Δ ҎԼͷهࣄ͕ஸೡͳͷͰಡΉͱ͍͍
• Associate DomainΛ༗ޮԽ | React Native(Expo)ʹUniversal LinksΛ࣮ͯ͠ɺWeb ͔ΒΞϓϦʹࣗಈભҠͤ͞Δʂʲલฤʳ 2 1 -
© JMDC Inc. 2 - 3 . rebuild͢Δ • app.config.tsͷมߋ༰ɺnative
layerͷมߋͳͷͰɺrebuild͢Δ • Provisioning Profileͷ࠶ੜඞཁͳͨΊɺ —non-intaractive ͳ͠Ͱ࣮ߦߦ͢Δ • Provisioning Profile͕Α͘Θ͔Βͳ͔ͬͨΒ ҎલͷొஃεϥΠυΛݟ͍ͯͩ͘͞ 2 2 -
© 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 -
© JMDC Inc. +native-intent.tsx Customizing links - Expo Documentation redirectSystemPath():
• URLでアプリを起動したときに呼ばれる • この関数から返されたpathを元にexpo-routerが画 面 遷移してくれる 2 5 -
© JMDC Inc. ಈ࡞֬ೝ FlutterͷυΩϡϝϯτ͕ஸೡ ϝϞʹWebαΠτͷURLΛషΓ͚ɺͦΕΛ։͍ͯɺΞϓϦ͕ىಈ͢Εྃ • Set up universal
links for iOS | Flutter • Set up app links for Android | Flutter CLIの場合: Android iOS 2 6 -
© JMDC Inc. Tips: Query Parameterͷencoder/decoderΛ࣮͠ͱ͍ͨ΄͏͕͍͍ • 一 般的にQuery Parameterはdecodeして渡すもの
• useLocalSearchParamsは、値をdecodeしてから使うようにしたほうがいい • WebView Screenに、外部からURLをQueryParameterで渡す時などに忘れがち 2 8 -
© JMDC Inc. Tips: initial࣌ʹը໘ભҠͤ͞Δͱը໘͕ඳը͞Εͳ͍ͱ͖ • initial࣌ʹpathΛॻ͖͑Δͱɺը໘͕ඳը͞Εͳ͍ͱ͍͏ʹૺ۰ͨ͠ • ঢ়ͱͯ͠ࣅͨIssue͕v 2
͕ͩ͋ͬͨ • initial route · Issue # 4 2 8 · expo/router · GitHub +native-intent.tsx app/index.tsx 2 9 -
© JMDC Inc. Tips: ೝূ͕͋ΔΞϓϦέʔγϣϯͰͷઃܭ • 認証フローがExpoのドキュメント通りに組んであるとラク • Authentication in
Expo Router - Expo Documentation • 初 手 は認証済みのトップページに 飛 ばし、_layoutで(Web|Deep) Linkのhandlingをす ると良さそう • ログインしてなかったユーザーが、ログインできたときに、 (Web|Deep) Linkで開こうとしてたページを開いてくれて親切 • 起動時のURLは Linking.getInitialURL() で取得できる 3 0 -
© JMDC Inc. Tips: ೝূ͕͋ΔΞϓϦέʔγϣϯͰͷઃܭ 意図しないApp Linkを雑に /webview で開くと困ることがある •
認証済みのRoutingに /webview を設置してあるという前提 • 意図しないWeb Linkを雑に /webview に投げつけると、未認証時にURLをアプリで開けないということが起こる • 「新規会員登録」「問い合わせ」「パスワードリセット」などのURLを開こうとすると、未認証トップに 飛 んでしまう • 一 応、URLをブラウザにURLを直貼りするとブラウザで回遊できるが、リテラシーが試される • Routing処理と別で「特定のpathが来たら、 WebBrowser で起動する」という処理を 入 れたほうが良さそう • ただし、雑にWebBrowserを使うと、Androidでバグるので次のTipsを参照 3 1 -
© JMDC Inc. Tips: Web Link対応したAndroidアプリͰWebBrowserΛ͏࣌ͷҙ • AndroidのWeb Linkを設定し、WebBrowserで開こうとすると、無限ループする •
Web → +native-intent.tsx → WebBrowserがWeb開く → Webからアプリに 飛 ばされる → … • そのため「このURLはWebBrowserで開け」と明 示 的に指定してやる必要がある 3 2