关闭

swift js 实现简单的交互 JavaScriptCore

标签: jsswiftjavascript
3384人阅读 评论(1) 收藏 举报
分类:

主要介绍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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:47193次
    • 积分:1250
    • 等级:
    • 排名:千里之外
    • 原创:78篇
    • 转载:27篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论