Swift 和 Javascript 集成
Posted
技术标签:
【中文标题】Swift 和 Javascript 集成【英文标题】:Swift and Javascript Integration 【发布时间】:2016-10-13 07:46:53 【问题描述】:我一直在关注this article 关于集成 Swift (WKWebView) 和 Javascript。 文章中的所有内容都可以正常工作,但我正在尝试将一些变量从 Swift 传递到 javascript。
这是我在 Swift 中的 ViewController:
import UIKit
import WebKit
class ViewController: UIViewController, WKScriptMessageHandler
@IBOutlet var containerView : UIView! = nil
var webView: WKWebView?
override func loadView()
super.loadView()
let contentController = WKUserContentController();
let userScript = WKUserScript(
source: "redHeader()",
injectionTime: WKUserScriptInjectionTime.AtDocumentEnd,
forMainFrameOnly: true
)
contentController.addUserScript(userScript)
contentController.addScriptMessageHandler(
self,
name: "callbackHandler"
)
let config = WKWebViewConfiguration()
config.userContentController = contentController
self.webView = WKWebView(
frame: self.view.frame,
configuration: config
)
self.view = self.webView!
override func viewDidLoad()
super.viewDidLoad()
let url = NSURL(string:"https://example.com")
let req = NSURLRequest(URL:url!)
self.webView!.loadRequest(req)
let simpleInt = 123
self.webView?.evaluateJavaScript("redHeader(\(simpleInt)", completionHandler: nil);
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)
if(message.name == "callbackHandler")
print("JavaScript is sending a message \(message.body)")
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
这就是驻留在服务器上的 HTML 和 JS:
function callNativeApp ()
try
webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
catch(err)
console.log('The native context does not exist yet');
setTimeout(function ()
callNativeApp();
, 50000);
function redHeader(int)
console.log(int);
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body
padding-top: 40px;
</style>
<title>WKWebView Demo</title>
<meta charset="UTF-8">
</head>
<body>
<h1>WKWebView Test</h1>
<script type="text/javascript" src="main.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</body>
</html>
它仍然只是上面文章中的代码,但我无法将变量 simpleInt 传递给 JS。
尽管 Javascript 调用
webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
也不行。
我认为我传递了错误的变量。有什么建议吗?
【问题讨论】:
【参考方案1】:您可以尝试一些事情
您的方法调用中缺少窗口
webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
应该是
window.webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
检查您是否能够从浏览器打开调试菜单访问此Check for enabling debug mode 的消息处理程序
window.webkit.messageHandlers.callbackHandler
-
另一个问题可能是在本地调用中使用超时。移除超时并添加一个按钮来调用 messageHandler。
【讨论】:
以上是关于Swift 和 Javascript 集成的主要内容,如果未能解决你的问题,请参考以下文章
swift 笔记:iOS与JavaScript的交互(一):UIWebView - 2.1直接使用字符串通过评估Java脚本(来自:)
从使用 wkwebview 返回值的 javascript 调用 swift 函数
Paytm 支付网关 java web 集成 - servlet 调用中的 jsp 示例有时由于提交中的 javascript 而无法正常工作