1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Swift] WKWebViewからJavaScriptに値を送りたい

Posted at

やりたいこと

  • iOSアプリ内の値をiOSアプリで表示しているWebViewに反映したい
  • 渡す値が複数ある

JavaScriptを実行する方法

既存の記事もたくさんありますが、以下のメソッドで実行できます

webView.evaluateJavaScript("実行したいscript")

WKWebViewから値を渡すには

postMessageを使います

webView?.evaluateJavaScript(
    "window.postMessage({'name':'message'},'*');"
)

これに値を増やせば複数送れるのでは?と思っていましたが、ダメでした

webView?.evaluateJavaScript(
    "window.postMessage({'name':'name1'}, {'key':'value'}, '*');"
)

それもそのはず、第2引数はmessageじゃなくてtargetだったため。

postMessageの引数の解説は以下の通り

  • message
    他のウィンドウに送られるデータ。データは構造化複製アルゴリズムに従ってシリアル化されます。つまり、手動でシリアル化することなく様々なデータオブジェクトを宛先に安全に渡すことができます。

  • targetOrigin
    イベントを配信するこのウィンドウのオリジンを指定します。リテラル文字列 "*" (優先順位なし) か URI のどちらかで指定します。イベントが配信される予定時刻に、このウィンドウの文書のスキーム、ホスト名、ポートが targetOrigin で指定されたものと一致しない場合、イベントは配信されません。この仕組みにより、メッセージが送信される場所を制御できます。例えば、 postMessage() をパスワードを送信するために使用する場合、悪意のある第三者によるパスワードの傍受を防ぐために、この引数がパスワードを含むメッセージの受信予定者と同じオリジンの URI であることが絶対に重要でしょう。 他のウィンドウの文書がどこにあるものか知っている場合は、 * ではなく、常に特定の targetOrigin を指定してください。特定のターゲットを指定しないと、悪意のあるサイトに送信したデータが開示されてしまいます。

  • transfer 省略可
    メッセージと一緒に移譲される移譲可能オブジェクトのシーケンスです。これらのオブジェクトの所有権は送信先に移譲され、送信元では使えなくなります。

引用元: https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage

やったこと

上記を受けて修正したのがこちら

webView?.evaluateJavaScript(
    "window.postMessage({'name':'name1', 'key':'value'}, '*');
")

大したことではないですが、これで複数の値が送れるようになりました。
アプリで選択した値を送るとか、使える場面があるかと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?