在这个提倡敏捷开发和H5横行的年代,原生App内嵌入一些H5页面已经成为一种流行的趋势。一套H5页面就能够适配复杂的iOS和Android页面,大量节省了开发和维护时间,若是原本就有移动端网页,只需简单适配便可完成,那咱们何乐而不为呢?苹果也顺应了潮流,在iOS7中提供了JavaScriptCore框架用来与网页中的JS进行交互。还有Facebook推出的React Native,也给跨平台开发提供了新的思路和解决方案,虽然目前它还不是很成熟。但做为一个开发者,对这些新技术的出现天然会感到无比的兴奋。本文主要介绍iOS开发中,Swift如何使用JavaScriptCore与网页中的JS进行交互。javascript
Github:https://github.com/YanlongMa/SwiftJavaScriptCore
若是本Demo对您有帮助,请不要吝啬您的Start(⊙o⊙)哦。html
import JavaScriptCore //记得导入JavaScriptCore
// 经过JSContext执行js代码
let context: JSContext = JSContext()
let result1: JSValue = context.evaluateScript("1 + 3")
print(result1) // 输出4
// 定义js变量和函数
context.evaluateScript("var num1 = 10; var num2 = 20;")
context.evaluateScript("function sum(param1, param2) { return param1 + param2; }")
// 经过js方法名调用方法
let result2 = context.evaluateScript("sum(num1, num2)")
print(result2) // 输出30
// 经过下标来获取js方法并调用方法
let squareFunc = context.objectForKeyedSubscript("sum")
let result3 = squareFunc.callWithArguments([10, 20]).toString()
print(result3) // 输出30
@objc protocol SwiftJavaScriptDelegate: JSExport {
// js调用App的微信支付功能 演示最基本的用法
func wxPay(orderNo: String)
// js调用App的微信分享功能 演示字典参数的使用
func wxShare(dict: [String: AnyObject])
// js调用App方法时传递多个参数 并弹出对话框 注意js调用时的函数名
func showDialog(title: String, message: String)
// js调用App的功能后 App再调用js函数执行回调
func callHandler(handleFuncName: String)
}
@objc class SwiftJavaScriptModel: NSObject, SwiftJavaScriptDelegate {
weak var controller: UIViewController?
weak var jsContext: JSContext?
func wxPay(orderNo: String) {
print("订单号:", orderNo)
// 调起微信支付逻辑
}
func wxShare(dict: [String: AnyObject]) {
print("分享信息:", dict)
// 调起微信分享逻辑
}
func showDialog(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "肯定", style: .Default, handler: nil))
self.controller?.presentViewController(alert, animated: true, completion: nil)
}
func callHandler(handleFuncName: String) {
let jsHandlerFunc = self.jsContext?.objectForKeyedSubscript("\(handleFuncName)")
let dict = ["name": "sean", "age": 18]
jsHandlerFunc?.callWithArguments([dict])
}
}
func addWebView() {
self.webView = UIWebView(frame: self.view.bounds)
self.view.addSubview(self.webView)
self.webView.delegate = self
self.webView.scalesPageToFit = true
// 加载本地Html页面
let url = NSBundle.mainBundle().URLForResource("demo", withExtension: "html")
let request = NSURLRequest(URL: url!)
// 加载网络Html页面 请设置容许Http请求
//let url = NSURL(string: "http://www.mayanlong.com");
//let request = NSURLRequest(URL: url!)
self.webView.loadRequest(request)
}
func webViewDidFinishLoad(webView: UIWebView) {
self.jsContext = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext
let model = SwiftJavaScriptModel()
model.controller = self
model.jsContext = self.jsContext
// 这一步是将SwiftJavaScriptModel模型注入到JS中,在JS就能够经过WebViewJavascriptBridge调用咱们暴露的方法了。
self.jsContext.setObject(model, forKeyedSubscript: "WebViewJavascriptBridge")
// 注册到本地的Html页面中
let url = NSBundle.mainBundle().URLForResource("demo", withExtension: "html")
self.jsContext.evaluateScript(try? String(contentsOfURL: url!, encoding: NSUTF8StringEncoding))
// 注册到网络Html页面 请设置容许Http请求
//let url = "http://www.mayanlong.com";
//let curUrl = self.webView.request?.URL?.absoluteString //WebView当前访问页面的连接 可动态注册
//self.jsContext.evaluateScript(try? String(contentsOfURL: NSURL(string: url)!, encoding: NSUTF8StringEncoding))
self.jsContext.exceptionHandler = { (context, exception) in
print("exception:", exception)
}
}
WebViewJavascriptBridge.wxPay('TN20160526')
WebViewJavascriptBridge.wxShare({
'title' : '马燕龙我的博客',
'description' : '一个专一于编程的技术博客',
'url' : 'http://www.mayanlong.com'
})
WebViewJavascriptBridge.showDialogMessage('马燕龙我的博客', '一个专一于编程的技术博客')
func callHandler(handleFuncName: String) {
let jsHandlerFunc = self.jsContext?.objectForKeyedSubscript("\(handleFuncName)")
let dict = ["name": "sean", "age": 18] jsHandlerFunc?.callWithArguments([dict]) }
这样,咱们就实现了Swift与JS的交互了,Demo中给出了详细的代码,你们能够下载运行。java
Github:https://github.com/YanlongMa/SwiftJavaScriptCore
若是本Demo对您有帮助,请不要吝啬您的Start(⊙o⊙)哦。git
本文首发于马燕龙我的博客,欢迎分享,转载请标明出处。
马燕龙我的博客:http://www.mayanlong.com
马燕龙我的微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongmagithub