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时钟周期 ...
随机推荐
- 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...
- TCP/IP协议族(三) 数字签名与HTTPS详解
前面几篇博客聊了HTTP的相关东西,今天就来聊一聊HTTPS的东西.因为HTTP协议本身存在着明文传输.不能很好的验证通信方的身份和无法验证报文的完整性等一些安全方面的确点,所以才有了HTTPS的缺陷 ...
- 剖析Asp.Net Web API路由系统---WebHost部署方式
上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...
- 初探 discuz
测试: vim /etc/hosts ##ip地址转换 修改windows 的配置文件,写字板打开 vim /usr/local/apache/conf/httpd.conf vim /u ...
- java判断字符串String中是否存在中文
public class IsContainChinese { public static boolean isContainChinese (String str){ boolean flag=tr ...
- 【Java深入研究】2、JVM类加载机制
一.先看看编写出的代码的执行过程: 二.研究类加载机制的意义 从上图可以看出,类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类 ...
- oracle 随笔
oracle分页 select * from (select a1.*, rownum rn from (select *from emp) a1 where rownum<=10) where ...
- Android游戏开发实践(1)之NDK与JNI开发04
Android游戏开发实践(1)之NDK与JNI开发04 有了前面几篇NDK与JNI开发相关基础做铺垫,再来通过代码说明下这方面具体的操作以及一些重要的细节.那么,就继续NDK与JNI的学习总结. 作 ...
- 基于ES6模块标准通过webpack打包HTM5项目
本篇主要演示通过webpack打包phaser项目,webpack安装方法在此处就不一一赘述了 经常用phaser来写html5游戏的朋友可能会发现,当游戏场景比较多时,如果都写在一个js文件中那么将 ...
- 精通gulp常用插件
本文主要展示的是gulp常用插件的使用方法和用途,通过对插件的熟练运用达到精通gulp.不定期更新.可以到github上面下载DEMO. github地址:lin-xin/gulp-plugins 匹 ...