質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1561閲覧

WKWebViewでJavaScriptの値を取得できない・・・。

yutopc7788

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/07/03 09:25

参考ホームページを見てやってみたのですが、javascriptを実行してもprintで出力がされません。
どこが不足しているのでしょうか?
ご回答をよろしくお願いいたします。
参考ホームページ:https://qiita.com/peta-m175/items/102d6d723fd87e722f83

下記がコードの内容です。
一部省略済みです。

swift

1import UIKit 2import WebKit 3 4class ViewController: UIViewController ,WKUIDelegate ,WKNavigationDelegate ,WKScriptMessageHandler{ 5 @IBOutlet weak var Webview: WKWebView! 6 @IBOutlet weak var progressView: UIProgressView! 7 8 var url = "URL" 9 10 override func loadView() { 11 super.loadView() 12 let webCfg: WKWebViewConfiguration = WKWebViewConfiguration() 13 let userController: WKUserContentController = WKUserContentController() 14 userController.add(self, name: "callbaclHandler") 15 webCfg.userContentController = userController; 16 Webview.uiDelegate = self 17 Webview.navigationDelegate = self 18 self.view.addSubview(Webview) 19} 20 21override func viewDidLoad() { 22 super.viewDidLoad() 23 if let url = URL(string: url){ 24 let request = URLRequest(url:url) 25 Webview.load(request) 26 } 27 } 28※一部省略 29func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage){ 30 if(message.name == "callbackHandler"){ 31 print("(message.body)") 32 } 33 }

html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width"> 6 <link rel="stylesheet" type="text/css" href="style.css"> 7 <title>ページタイトル</title> 8 </head> 9 <body> 10 <h1 id="title">タイトル</h1> 11 <a href="#" onclick="LinkClick()">実行</a><br /> 12 <script type="text/javascript"> 13 function LinkClick() { 14 webkit.messageHandlers.callbackHandler.postMessage("こんにちは"); 15 } 16 </script> 17 </body> 18</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

webCfgがWebViewに渡されていないからだと思います。

ただしWKWebViewのconfigurationは読み取り専用でinitでしか渡すことができないので。
WebViewの生成をstoryboardではなくコードで行うか、webCfgの使用をやめてWebViewのconfigurationにセットするかすればいいでしょう。
簡単なのは後者でしょうけど。

追記

とりあえず後者の方法を。
loadView()のuserContentControllerをセットしているあたりに以下のコードを追加するだけです。
→実際に試したら動きませんでした。追記2参照

WebView.configuration.userContentController = userController

追記2

実際に試してみました。
すみません。どうやらuserContentControllerへの代入だと動作しないようです。
WebviewにセットしてあるuserContentControllerに直接addすると動作しました。
あとcallbackHandlerのスペルもミスってたのでそこも直しました。

override func loadView() { super.loadView() //let webCfg: WKWebViewConfiguration = WKWebViewConfiguration() //let userController: WKUserContentController = WKUserContentController() //userController.add(self, name: "callbaclHandler") //webCfg.userContentController = userController; Webview.configuration.userContentController.add(self, name: "callbackHandler") Webview.uiDelegate = self Webview.navigationDelegate = self self.view.addSubview(Webview) }

それとこれは回答とは関係ないのですが。
storyboardで画面を作った場合はloadViewをoverrideしないようにとリファレンスに書いてあります。
loadViewはコードでself.viewを生成する時ぐらいしか使わないと思います。
ビューの初期化はviewDidLoad()で行いましょう。

投稿2018/07/03 14:21

編集2018/07/04 00:58
u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutopc7788

2018/07/03 15:08

ちなみにコードを書いていただけると助かります。 お忙しいと思いますがよろしくお願いします... WebView = WKWebView(frame: view.frame, configuration: webCfg) 上記のものを追加しましたが、動作はしませんでした。 助けてください。
u39ueda

2018/07/03 15:47

具体的なコードを追加しました。動作確認したわけじゃないので悪しからず。
yutopc7788

2018/07/03 21:00

やはり動作はしませんでした。 追加するだけだとだめなのでしょうか?
u39ueda

2018/07/04 01:04

すみません。実際に試したらダメでした。実際に動いたコードを追加しました。 それと末尾に書いたように本来これらはviewDidLoadで書くべき内容です。とりあえず動く状態にするのが先だと思いますのでloadViewで書きましたが、動くようになったらviewDidLoadに移すことをお勧めします。
yutopc7788

2018/07/04 03:54

大変ありがとうございました。 無事出力されました。 また何かありましたらご回答をいただければと思います。
yutopc7788

2018/07/04 03:55

記載の内容もviewDidLoadに移して動作確認いたしました。 ベストアンサーとフォローをさせていただきました。 ありがとうございました????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問