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时钟周期 ...
随机推荐
- 在Windows 10删除百度云盘的盘符
1点击微软图标不放,然后点击R 打开运行命令 2输入 Regedit 进入注册表 3找到以下路径:HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows ...
- codevs 1262 不要把球传我 2012年CCC加拿大高中生信息学奥赛
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description CCC的足球比赛和传统的足球比赛有一点不同, 一次进球当且仅当先后接触到球的 ...
- codevs 3054 高精度练习-文件操作
时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入一组数据,将每个数据加1后输出 输入描述 Input Descripti ...
- 洛谷 P2347 砝码称重 != codevs 2144
题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝 ...
- 传统BP对比CNN
传统BP vs CNN 存在2个问题 传统BP网络存在的问题: 权值太多,计算量太大 权值太多,需要大量样本进行训练 传统的BP来处理图像问题的话因为计算权值太多太大. 网络的建立要根据数据的大小来建 ...
- Jordan 标准型的实例
将学习到什么 练习一下如何把一个矩阵化为 Jordan 标准型. 将矩阵化为 Jordan 标准型需要三步: 第一步 求出矩阵 \(A \in M_n\) 全部的特征值 \(\lambda_1,\ ...
- Linux网络管理及基础设置
一.网络管理 1 临时配置网络(ip,网关,dns) 用ifconfig命令设定网卡的IP地址: ens33网卡的IP地址为192.168.16.154, ifconfig ens33 192.168 ...
- JAVA遍历map元素
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- 第六次作业 :使用Excel制作成绩单
- MAC的睡眠模式介绍
因为之前用的是网上流传的土法来禁止生成 sleepimage,尝到了苦头,而且2次! 大家知道 OSX 有几种睡眠模式,其中 hibernatemode 可以是 0 (传统睡眠方式,不生成 sleep ...