swift js 实现简单的交互 JavaScriptCore

主要介绍xcode自带的JavaScriptCore.framework的用法

添加framework  工程文件->target->general->linked frameworks and libraries ->下面+号点下 搜索javascriptCore ->添加

import UIKit

import JavaScriptCore


//这边是直接用模型做的比较方便也比较严谨利于扩展 直接调用就不介绍了

//JSExport要遵从这个协议才能使自己的api对外界开放

@objc protocol JavaScriptSwiftDelegate:JSExport

{


    //定义协议 这边可以传参 也可以传字典啥的 可以定义多个方法 

//传多个参数用字典比较合适 单个参数直接传

    func payResult(dict: [String:AnyObject])



}

//创建模型 在模型中实现代理

@objc class JSModelSwift:NSObject,JavaScriptSwiftDelegate

{


    weak var jsContext:JSContext?

    

    //定义模型方法

     func payResult(dict: [String:AnyObject])

     {

        //打印获取的值 这边讲一下 原理是这样的模型后面会注册到js中这样js就可以调用模型及其方法,一般要配合后台人员传参所以这边的参数是已经有值得可以直接打印出来

        NSLog(" @ ",dict)

        

        //js方法传值这边实现传值swift调用js

这边是从swift端向js端传数据 所以要在js端定义一个function来接收

//        let jsParamsFunc = self.jsContext?.objectForKeyedSubscript("jsParamsFunc")

//        let dict = NSDictionary(dictionary: ["from":"订单","payCode":9000,"payInfo":"seccuess"])

//        jsParamsFunc?.callWithArguments([dict])

        

//js端的代码

  

//var jsParamFunc = function(argument) {

//这边是讲html上的一个元素用字典的一个value赋值

 // document.getElementById('jsParamFuncSpan').innerHTML

 // = argument['payCode'];

}


 

    }

//


}

//在webView中实现交互

class ViewController:UIViewController,UIWebViewDelegate {

  var webView:UIWebView!

  var jsContext:JSContext?

  

  overridefunc viewDidLoad() {

    super.viewDidLoad()


    self.webView =UIWebView(frame:self.view.bounds);

    self.view.addSubview(self.webView)

    self.webView.delegate =self

    self.webView.scalesPageToFit = true;

    let url ="..."

    let request =NSURLRequest(URL: url!)

    self.webView.loadRequest(request)

    }

    

  

  // MARK: - UIWebViewDelegate 在webView 代理中实现交互

  func webViewDidFinishLoad(webView:UIWebView) {

//创建js中的上下文环境

    let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext")as?JSContext

//创建模型

    let model =JSModelSwift()

    model.jsContext = context

    self.jsContext = context

    

    // 这一步是将JSModel这个模型注入到JS中,在JS就可以通过JSModel调用我们公暴露的方法了。从而实现从js端向app端传值了 

//附一段传值事件

//<input type="button"value="Call ObjC func with JSON and ObjC call js func to pass //args."onclick="JSModel.payResult({'payCode': 100, 'payInfo': 'faile', 'from': 'Xcode'})">

这边数据是后台的事 后台只要在onclick事件后面添加JSModel.payResult({'payCode': 100, 'payInfo': 'faile', 'from': 'Xcode'})方法并且传数据 Xcode就可以获取数据了

//

   self.jsContext?.setObject(model, forKeyedSubscript:"JSModel")



    //捕捉异常可以不写

    self.jsContext?.exceptionHandler = {

      (context, exception) in

         print("exception @", exception)

    }

  }

  

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值