第一步copy代码到你的uiwebview所在的viewcontrol中,
@objc protocol JavaScriptSwiftDelegate: JSExport {
func chatWithExpert(dict: [String: AnyObject]);
}
@objc class JSObjCModel: NSObject, JavaScriptSwiftDelegate {
weak var controller: UIViewController?
weak var jsContext: JSContext?
func chatWithExpert(dict: [String: AnyObject]){
print(dict["imId"] as! String)
let chatRoom : ChatController = ChatController(conversationChatter: dict["imId"] as! String, conversationType: EMConversationTypeChat)
let user : IMUserEntity = IMUserEntity()
user.nickName = dict["name"] as? String
user.username = dict["imId"] as? String
user.userPic = dict["image"] as? String
IMUserManager.shareUserManager.updateUserInformationInBackground(user)
chatRoom.hidesBottomBarWhenPushed = true
dispatch_async(dispatch_get_main_queue()) { () -> Void in
self.controller!.navigationController?.pushViewController(chatRoom, animated: true)
}
}
}
第二步 注入就是让两者关联起来
self.jsContext = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext
let model = JSObjCModel()
model.controller = self
model.jsContext = self.jsContext
// 这一步是将SwiftJavaScriptModel模型注入到JS中,在JS就可以通过WebViewJavascriptBridge调用我们暴露的方法了。
// self.jsContext!.setObject(model, forKeyedSubscript: "SwiftWebViewBridge")
// 这一步是将SwiftJavaScriptModel模型注入到JS中,在JS就可以通过WebViewJavascriptBridge调用我们暴露的方法了。
self.jsContext.setObject(model, forKeyedSubscript: "SwiftWebViewBridge")
self.jsContext!.exceptionHandler = { (context, exception) in
print("exception:", exception)
}```
第三步:可能出现的bug
我调入的坑:协议中方法的参数问题,如果是舞参数很ok,一个参数也还行,如果是两个即以上的建议使用字典。
chatWithExpert()
chatWithExpert(test:String)
chatWithExpert(dict: [String: AnyObject])
其他的自行研究吧
如果一定传两个,注意js中方法名和swif中语法名称的不一致性
大致是js:chatWithExpert(test:String,msg:String)
swift: chatWithExpert*Msg*(test:String,msg:String)