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

ステートマシンを活用したWebView-ネイティブ間連携へのアプローチ / An Approach to WebView-Native Communication Using State Machines

marcy731
September 01, 2023

ステートマシンを活用したWebView-ネイティブ間連携へのアプローチ / An Approach to WebView-Native Communication Using State Machines

iOSDC Japan 2023 day0 18:45~ TrackA で登壇するさいの資料になります。
https://fortee.jp/iosdc-japan-2023/proposal/8a41d745-7906-41ca-b05d-c6551c1d23a8

marcy731

September 01, 2023
Tweet

More Decks by marcy731

Other Decks in Programming

Transcript

  1. 基礎知識 5 ❏ WebViewとネイティブ側を「連携する」とは ❏ WebViewとネイティブ側が、効果的に情報を共有し相互に連動 すること ❏ ネイティブ <->

    WebViewのデータの受け渡し ❏ ex: JavaScript経由でデータを送信するなど ❏ WebView内でのユーザーアクションをネイティブ側でトリガー ❏ ex: ボタン押下 ❏ ネイティブ側からWebView内のJavaScript関数を呼び出して、特定のアクションを実行
  2. 基礎知識 6 ❏ 「連携」させるため、まずは以下をおさらいする ❏ WKNavigationDelegate ❏ URLへのアクセス許可やURLリクエストの読み込み状況を把握するためのAPI ❏ WKScriptMessageHandler

    ❏ Webコンテンツ側からネイティブ側にメッセージングするAPI ❏ WKUserScript ❏ WebコンテンツにJavaScriptを挿入するAPI ❏ evaluateJavaScript(_:completionHandler:) ❏ 任意のタイミングでJavaScriptを実行するAPI
  3. ❏ KVO: Key-Value Observing ❏ 対象のオブジェクトを監視し、変更を通知してくれる仕組み KVO実装例 12 基礎知識 -

    KVO: Key-Value Observing - urlを監視し、変更があればクロージャーが呼ばれる
  4. ❏ KVO: Key-Value Observing ❏ 対象のオブジェクトを監視し、変更を通知してくれる仕組み Combineでの実装例 13 基礎知識 -

    KVO: Key-Value Observing - urlを監視し、変更があればsinkのクロージャーが呼ばれる
  5. ❏ WKUserScript ❏ WebコンテンツにJavaScriptを挿入するAPI 実装例 23 基礎知識 - WKUserScript -

    ①JavaScriptをWKUserScriptに変換 ②WKUserContentControllerに追加
  6. 28 基礎知識 - evaluateJavaScript(_:completionHandler:) - ❏ evaluateJavaScript(_:completionHandler:) ❏ 任意のタイミングでJavaScriptを実行するAPI 実装例

    「読み込み完了時」に実行 実行後、クロージャー内が呼ばれる JavaScriptの実行結果を取得できる
  7. WebView-ネイティブ間連携の基礎知識 - まとめ - 29 ❏ WebViewとネイティブ側の連携 ❏ WKNavigationDelegate ❏

    WKScriptMessageHandler ❏ WKUserScript ❏ WKWenView.evaluateJavaScript(_:completionHandler:) ❏ これらの方法を駆使し、適切なタイミングで連携していく
  8. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 34 ❏ ネイティブ(App)とWebView(EC)の関係 他社管理 ・アカウント管理 ・ポイント付与 ・購買履歴分析 ・お知らせ送付 ・クーポン送付

    App WebView (ECサイト) Native App Backend アカウント情報(Webhook) WebView(ECサイト)でログイン → Appでもログイン ログイン・会員情報 ・アカウント管理 ・在庫管理 ・注文管理 ・発送管理 ECサイト/ Backend
  9. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 39 ❏ ログインシーケンス App EC(WebView) App Backend EC Backend

    ①ログインページ表示 ③ECログインリクエスト ⑤ECログイン成功 ②email/pass入力 ④入力したemailを取得
  10. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 40 ❏ ログインシーケンス App EC(WebView) App Backend EC Backend

    ①ログインページ表示 ③ECログインリクエスト ⑤ECログイン成功 ⑥ECログイン成功 ②email/pass入力 ④入力したemailを取得
  11. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 41 ❏ ログインシーケンス App EC(WebView) App Backend EC Backend

    ①ログインページ表示 ③ECログインリクエスト ⑤ECログイン成功 ⑥ECログイン成功 ②email/pass入力 ④入力したemailを取得 ⑦AppログインAPI with email
  12. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 42 ❏ ログインシーケンス App EC(WebView) App Backend EC Backend

    ①ログインページ表示 ③ECログインリクエスト ⑤ECログイン成功 ⑥ECログイン成功 ②email/pass入力 ④入力したemailを取得 ⑦AppログインAPI with email ⑧Appログイン成功
  13. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 43 ❏ ログインシーケンス App EC(WebView) App Backend EC Backend

    ①ログインページ表示 ③ECログインリクエスト ⑤ECログイン成功 ⑥ECログイン成功 ②email/pass入力 ④入力したemailを取得 ⑦AppログインAPI with email ⑧Appログイン成功 連携ポイント
  14. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 57 ❏ 「⑥ECログイン成功」の連携(これが問題) ❏ ログイン成功時にWKScriptMessageHandler経由での連携 ❏ 今回、外部Webコンテンツのため、この手法が取れない ❏ ログインボタン押下?

    ❏ 成功 or 失敗はわからない ❏ URL遷移? ❏ ログイン成功する場合、/login -> / のような遷移 ❏ Go Back時も/login -> / のような遷移になる? ❏ ログインボタンタップ後、/ に遷移すれば良い?
  15. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 58 ❏ 「⑥ECログイン成功」の連携(これが問題) ❏ ログイン成功時にWKScriptMessageHandler経由での連携 ❏ 今回、外部Webコンテンツのため、この手法が取れない ❏ ログインボタン押下?

    ❏ 成功 or 失敗はわからない ❏ URL遷移? ❏ ログイン成功する場合、/login -> / のような遷移 ❏ Go Back時も/login -> / のような遷移になる? ❏ ログインボタンタップ後、/ に遷移すれば良い? →良さそう
  16. 事例:外部のECサイトをアプリに組み込んで、会員情報・認証情報をアプリと同期させたい 59 ❏ 「⑥ECログイン成功」の連携(これが問題) ❏ ログイン成功時にWKScriptMessageHandler経由での連携 ❏ 今回、外部Webコンテンツのため、この手法が取れない ❏ ログインボタン押下?

    ❏ 成功 or 失敗はわからない ❏ URL遷移? ❏ ログイン成功する場合、/login -> / のような遷移 ❏ Go Back時も/login -> / のような遷移になる? ❏ ログインボタンタップ後、/ に遷移すれば良い? →良さそう ❏ ログインボタンタップ後の遷移ということはどう判断する? フラグ?
  17. ステートマシンを活用した状態管理 76 ❏ ステート図(StateDiagram)を書くとロジックがシンプルに記述できる ❏ 「State(before) -> State(afger) : Event

    / SideEffect 」の組み合わせ ❏ 実はステートマシンとWebViewのステート管理は相性が良い ❏ 構成要素 ❏ 状態(State) ❏ どのURLが表示されているか ❏ ログイン処理状況 ❏ イベント(Events) ❏ 読み込み開始/終了 ❏ ボタンイベントリスナー ❏ 副作用(Side-Effects) ❏ APIリクエスト ❏ エラー表示
  18. 具体的な実装方法 79 ❏ ステートマシン の実装手順 1) ステート図(State Diagram)を作成 2) State

    / Event / SideEffect を定義 3) Transitionを定義 4) StateMachineインスタンス生成 / SideEffect の実装 5) 適切なタイミングでEventを発火
  19. 具体的な実装方法 - Event の発火 - 97 ❏ State / Event

    / Transition / SideEffect を定義したら、 適切なタイミングでEventを発火させれば良い。 ❏ タイミングは「WebView-ネイティブ間連携の基礎知識」参照 例 ❏ トップページ読み込み完了時 ❏ ログインページ読み込み完了時
  20. 具体的な実装方法 - Event の発火 - 98 ❏ State / Event

    / Transition / SideEffect を定義したら、 適切なタイミングでEventを発火させれば良い。 ❏ タイミングは「WebView-ネイティブ間連携の基礎知識」参照 例 ❏ トップページ読み込み完了時 ❏ ログインページ読み込み完了時 「トップページ読み込み完了」のEventを発火