SwiftWebViewBridge 0.3.0

SwiftWebViewBridge 0.3.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
Released上次发布2017年1月
SwiftSwift版本3.0
SPM支持SPM

ShawnFoo维护。



  • Shawn Foo

SwiftWebViewBridge

WebViewJavascriptBridge的Swift版本,提供了更加简化、友好的方法,在UIWebViews中发送Swift和JS之间的消息。


  1. 安装
  2. 预览
  3. 要求
  4. 如何使用
  5. 挖掘

安装

手动安装(iOS7+)

SwiftWebViewBridge.swift文件拖到您的项目中。

预览

preview preview2

要求

  1. Xcode7.0+
  2. iOS7.0+

可选

SwiftyJSON:SwiftyJSON使得在Swift中处理JSON数据变得简单。

Swift和JS之间的通信依赖于JSON消息。在闭包中获取的参数 jsonData 会通过以下方法进行反序列化。您可以将它简单地传递给SwiftJSON的指定初始化器JSON(jsonObject)

NSJSONSerialization.JSONObjectWithData(serilizedData, .AllowFragments)
func JSONObjectWithData(_ data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject

如何使用

通用

  1. 使用默认处理器初始化桥接器
  2. 注册处理器来处理不同的事件
  3. 发送数据 / 在两边调用处理器

对于Swift

func bridge(_ webView: UIWebView, defaultHandler handler: SWVBHandler?) -> SwiftWebViewBridge

生成一个具有相关webView和默认处理器的桥接器,以处理js的消息,而不指定指定的处理器

let bridge = SwiftJavaScriptBridge.bridge(webView, defaultHandler: { data, responseCallback in
    print("Swift received message from JS: \(data)")
    responseCallback("Swift already got your msg, thanks")
}) 
func registerHandlerForJS(handlerName name: String, handler: SWVBHandler)

为JavaScript调用注册处理器

// take care of retain cycle!
bridge.registerHandlerForJS(handlerName: "getSesionId", handler: { [unowned self] data, responseCallback in
    let sid = self.session            
    responseCallback(["msg": "Swift has already finished its handler", "returnValue": [1, 2, 3]])
})
func sendDataToJS(_ data: SWVBData)

简单地向JS发送数据

bridge.sendDataToJS(["msg": "Hello JavaScript", "gift": ["100CNY", "1000CNY", "10000CNY"]])
func sendDataToJS(_ data: SWVBData, responseCallback: SWVBResponseCallBack?)

使用回调闭包向JS发送数据

bridge.sendDataToJS("Did you received my gift, JS?", responseCallback: { data in
    print("Receiving JS return gift: \(data)")
})
func callJSHandler(_ handlerName: String?, params: SWVBData?, responseCallback: SWVBResponseCallBack?)

调用注册的JavaScript处理器

bridge.callJSHandler("alertReceivedParmas", params: ["msg": "JS, are you there?"], responseCallback: nil)
上面提到的别名
/// 1st param: responseData to JS
public typealias SWVBResponseCallBack = (NSDictionary) -> Void
/// 1st param: jsonData sent from JS; 2nd param: responseCallback for sending data back to JS
public typealias SWVBHandler = (AnyObject, @escaping SWVBResponseCallBack) -> Void
public typealias SWVBData = [String: Any]
调试日志
SwiftWebViewBridge.logging = false  //default true

对于JavaScript

function init(defaultHandler)
bridge.init(function(message, responseCallback) {
    log('JS got a message', message)
    var data = { 'JS Responds' : 'Message received = )' }
    responseCallback(data)
})
function registerHandlerForSwift(handlerName, handler)
bridge.registerHandlerForSwift('alertReceivedParmas', function(data, responseCallback) {
    log('ObjC called alertPassinParmas with', JSON.stringify(data))
    alert(JSON.stringify(data))
    var responseData = { 'JS Responds' : 'alert triggered' }
    responseCallback(responseData)
})
function sendDataToSwift(data, responseCallback)
bridge.sendDataToSwift('Say Hello Swiftly to Swift')
bridge.sendDataToSwift('Hi, anybody there?', function(responseData){
    alert("got your response: " + JSON.stringify(responseData))
})
function callSwiftHandler(handlerName, data, responseCallback)
SwiftWebViewBridge.callSwiftHandler("printReceivedParmas", {"name": "小明", "age": "6", "school": "GDUT"}, function(responseData){
    log('JS got responds from Swift: ', responseData)
})

Dig it up

源代码包含非常详细的注释,这可以帮助你挖掘出Swift和JavaScript如何互相通信。此外,你还可以在UnminifiedJavascript文档中找到未压缩的JavaScript文件。