javaScriptCore 实战 与 小结
源码在这,看不懂的直接撸源码就行,转载声明出处
- 原生调用JS的大致流程,做了个思维简图

这是代码流程
// JS数据
func getJSVar() { let context: JSContext = JSContext() //定义JS环境
let result1: JSValue = context.evaluateScript("1 + 1") //执行JS代码
print(result1) // 输出2 // 定义js变量和函数
context.evaluateScript("function sum(param1, param2) { return param1 + param2; }") //通过下标来获取js方法并调用方法
let pp_func = context.objectForKeyedSubscript("sum")
let result = pp_func?.call(withArguments: [,]).toString()
print(result!) //输出20 //下标获取js数组的值
context.evaluateScript("var names = ['vincen1', 'vincen2', 'vincen3']") let names = context.objectForKeyedSubscript("names") let name = names?.objectAtIndexedSubscript().toString() print(name ?? "空值处理") //输出 Grace }
- 重点是JS调用原生,看流程图

import UIKit
import JavaScriptCore @objc protocol swiftDelegate : JSExport
{ func wxPay(_ orderNo: String) //这里的方法与JS调用名相同 func wxShare(_ dict: [String : AnyObject]) func showDMessage(_ dict1:[String : String], _ dict2 : String)
// js调用App的功能后 App再调用js函数执行回调 func callHandler(_ handleFuncName: String) } @objc class javaScriptModel: NSObject ,swiftDelegate { weak var controller: UIViewController? weak var jsContext: JSContext? func wxPay(_ orderNo: String) { // print("订单号:", orderNo)
showDialog("", message: "获取到订单号\(orderNo),调用微信支付") // 调起微信支付逻辑
} func showDMessage(_ dict1: [String : String], _ dict2: String) { showDialog("", message:"我是第一个字典\(dict1)-----我是第二个字符串\(dict2)") } func wxShare(_ dict: [String : AnyObject]) { showDialog("", message: "获取到分享的字典\(dict),调用微信支付") } func callHandler(_ handleFuncName: String) { let jshandFunc = jsContext?.objectForKeyedSubscript("\(handleFuncName)")
let dict = ["name" : "pp"] as [String : Any]
jshandFunc?.call(withArguments: [dict])
} func showDialog(_ title: String, message: String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: nil))
controller?.present(alert, animated: true, completion: nil) } }
然后在VC中的webview中代理方法中注入模型
//webview代理中,绑定原生协议方法
func webViewDidFinishLoad(_ webView: UIWebView) { pp_jsContext = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as! JSContext
let model = javaScriptModel()
model.controller = self
model.jsContext = pp_jsContext // 这一步是将SwiftJavaScriptModel模型注入到JS中,在JS就可以通过WebViewJSBridge调用我们暴露的方法了。
pp_jsContext.setObject(model, forKeyedSubscript: "WebViewJSBridge" as (NSCopying & NSObjectProtocol)!) //
pp_jsContext.exceptionHandler = { (context, exception) in
//打印异常
print("exception:", exception)
}
}
到这里基本上完成了,有不足的地方欢迎指正。
javaScriptCore 实战 与 小结的更多相关文章
- javaScriptCore 实战与小结
源码在这,看不懂的直接撸源码就行,转载声明出处 原生调用JS的大致流程,做了个思维简图 这是代码流程 // JS数据 func getJSVar() { let context: JSContex ...
- layer弹窗插件实战用法小结1—— layer.alert()
http://layer.layui.com 第一节:layer.alert()弹窗的用法 1.解压layer-v2.2.zip压缩包 2.拷贝layer文件夹到实战项目目录 3.注意:layer.j ...
- 1300多万条数据30G论坛大数据优化实战经验小结
最近由于某大型网站社区论坛运行效率比较低用户反馈论坛有些卡需要对系统进行优化,论坛性能影响了公司的形象还有网站的流量,当然这也会影响到公司的收入,而且后期还需要长期维护网站的社区论坛服务. 1:并发访 ...
- [转]java selenium webdriver实战 应用小结
原文链接:http://www.cnblogs.com/itliucheng/p/5578788.html 部分api 1.访问网站 driver.get("http://www.baidu ...
- java selenium webdriver实战 应用小结
部分api 1.访问网站 driver.get("http://www.baidu.com"); 或者 driver.navigate().to("http://www. ...
- 跟我学SpringCloud | 第十五篇:微服务利剑之APM平台(一)Skywalking
目录 SpringCloud系列教程 | 第十五篇:微服务利剑之APM平台(一)Skywalking 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要 ...
- 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint
目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...
- Dubbo 与 Spring Cloud 完美结合
Dubbo 与 Spring Cloud 完美结合 1. 概述 可能说起来Dubbo,很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时 ...
- 《Java 8 in Action》Chapter 11:CompletableFuture:组合式异步编程
某个网站的数据来自Facebook.Twitter和Google,这就需要网站与互联网上的多个Web服务通信.可是,你并不希望因为等待某些服务的响应,阻塞应用程序的运行,浪费数十亿宝贵的CPU时钟周期 ...
随机推荐
- iOS中的三大定时器
iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD. NSTimer 方式1 // 创建定时器 NSTimer *timer = [NST ...
- Omi教程-使用group-data通讯
写在前面 Omi框架组建间的通讯非常遍历灵活,上篇文章介绍了几种通讯方式,其中childrenData的方式可以批量传递数据给组件,但是有很多场景下data的来源不一定非要都从childrenData ...
- Cassandra 学习笔记 - 1 - 关于Cassandra
摘要 - Cassandra 的历史 Cassandra能做什么 Apache Cassandra最早是Facebook为了改进他们的Inbox搜索功能,由Avanash Lakshman和Prash ...
- 多源最短路径---Floyd-Warshall算法
摘自啊哈算法-知识分享,代码自己有改动,使得输出更直观. 小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间没有,如下图.为了节省经费以及方便计划旅程,小哼希望出发之前知道任意两个城市之间的最短 ...
- nodejs 代码设计模式1:同步函数变异步
同步函数变异步 1 问题: 1.1 碰到需要调用你刚正在创建的对像. function createServer(data, cb) { data.num = 1; cb(); return data ...
- React Native填坑之旅 -- 使用iOS原生视图(高德地图)
在开发React Native的App的时候,你会遇到很多情况是原生的视图组件已经开发好了的.有的是系统的SDK提供的,有的是第三方试图组件,总之你的APP可以直接使用的原生视图是很多的.React ...
- MAC软件下载链接地址
博客开启,今天向大家推荐一款MAC软件大全地址. 下载地址:http://www.pc6.com/mac/111949.html
- 不用搭环境的10分钟AngularJS指令简易入门01(含例子)
不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...
- MySQL 修改最大连接数
方法一:进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MySQ ...
- 启程、对C的继承
Cocoa和Object-c是苹果公司OS X和IOS操作系统的核心. .m扩展名表示文件使用的是Objective-c代码. 与C语言一样,Objective-c使用头文件来包含结构体.符号 ...