[Cordova]JS和Native交互实现关键代码(iOS)

一、JS中定义的exec函数:define("cordova/exec", function(require, exports, module) 。关键实现代码如下:

1.建立command对象,并且将命令推入commandQueue
var command = [callbackId, service, action, actionArgs];
commandQueue.push(JSON.stringify(command));

2.建立不可见的iframe,并且在后续会将此iframe添加的页面
function createExecIframe() {
    var iframe = document.createElement("iframe");
    iframe.style.display = 'none';
    document.body.appendChild(iframe);
    return iframe;
}

3.将iframe的链接设置为“gap://ready”,此时网页端会发送一个请求
execIframe = execIframe || createExecIframe();
execIframe.src = "gap://ready";

二、UIWebView中拦截请求

1.CDVViewController中,实现了webview的代理方法:
- (BOOL)webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

2.当网页端发起iframe中的请求时,请求会被此方法拦截:
if ([[url scheme] isEqualToString:@"gap"]) {
    [_commandQueue fetchCommandsFromJs];
    return NO;
}
当发现网页链接是gap协议的,此时通过fetchCommandsFromJs方法获取命令对象并执行,并且返回NO。实现的效果:既拦截了命令,而且页面不做变化。

2.fetchCommandsFromJs实现

(1)通过执行js脚本,获取网页端js对象commandQueue中的命令(转换为Json的字符串格式,包含服务名,方法名,以及参数列表)
NSString* queuedCommandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString:
   @"cordova.require('cordova/exec').nativeFetchMessages()"];
   
(2)将json字符串解析,并且合成CDVInvokedUrlCommand对象
NSArray* commandBatch = [queuedCommandsJSON JSONObject];
CDVInvokedUrlCommand* command = [[CDVInvokedUrlCommand alloc] initFromJson:commandBatch];

(3)执行Command对象
//通过类名获取plugin实例
CDVPlugin* obj = [_viewController.commandDelegate getCommandInstance:command.className];
//通过方法名创建方法对象
SEL normalSelector = NSSelectorFromString(methodName);
//通过参数字符串列表创建参数列表对象
NSMutableArray* arguments = nil;
NSMutableDictionary* dict = nil;
[command legacyArguments:&arguments andDict:&dict];
//发送消息
objc_msgSend(obj, legacySelector, arguments, dict);

三、Native代码回调JS

1.在plugin的功能方法实现中,我们手动调用如下函数向js页面返回结果
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];

2.在如上方法的实现中,实现如下:
NSString* js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeCallback('%@',%d,%@,%d)", callbackId, status, argumentsAsJSON, keepCallback];
[_viewController.webView stringByEvaluatingJavaScriptFromString:js];

四、总结:经上面的步骤,一个完整的交互流程就实现了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10专业版激活方法——亲测可行!!!

转自:https://blog.csdn.net/AinUser/article/details/79247841 1.首先在桌面左下角的“cortana”搜索框中输入“CMD”,待出现“命令提示符”工具时,右击选择“以管理员身份”运行。 2.此时将“以管理员身份”打开“MSDOS”窗口,在此界面中&…

CoreData简介

一、概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 3.好处:能够合理管理内存,避免使用sql的麻烦,高效…

synthesize和dynamic

在声明property属性后,有2种实现选择一、synthesize编译器期间,让编译器自动生成getter/setter方法。当有自定义的存或取方法时,自定义会屏蔽自动生成该方法.二、dynamic告诉编译器,不自动生成getter/setter方法,避免编…

NSZombieEnabled使用

我们做iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像Thread 1: Program received signal:"EXC_BAD_ACCESS",让问题无从找起…

XCode的控制台调试命令

XCode4.0以后,编译器换成了LLVM 编译器 2.0,与以前相比,更加强大: 1.LLVM 编译器是下一带开源的编译技术.完全支持C, Objective-C, 和 C. 2.LLVM 速度比 GCC快两倍,建立的程序也会运行的更快. 因为它更好的利用现代的芯片的结构. …

通过终端,查看sqlite3的存储文件

在调试应用的时候,可以查看数据库里的数据。 1、定位到模拟器的目录 cd ~/Library/Application\ Support/iPhone\ Simulator 2、查找文件名包含 OrgChart.sqlite的文件,并打印路径 find . -name "OrgChart.sqlite" –print 输出: .…

NSURLCache缓存使用简介

一、需求1.在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制。使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服…

获取GIF图片中所有的单图

一、场景需求iOS系统中不支持flash,所以gif图片无法播放。需要将gif中的所有单图拿出来,自己来实现轮播动画。ImageIO框架中提供了获取gif图片中所有单图的相关API。二、使用简介1.首先根据gif图片文件初始化CGImageSourceRef:CFDataRef可以通…

回头看看NSURLConnection

一、基础代理1.使用场景&#xff1a;网络错误提示&#xff0c;以及证书使用控制。2.协议内容protocol NSURLConnectionDelegate <NSObject>optional- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;- (BOOL)connectionShouldUseCre…

生成同时兼容iOS真机和模拟器的.a包

一、步骤&#xff1a;1.首先分别生成模拟器架构和真机架构的.a包&#xff0c;然后在合并。2.使用命令&#xff1a;lipo -create 模拟器架构.a 真机架构.a -output 兼容架构.a3.其它有用的功能&#xff1a;&#xff08;1&#xff09;查看某一个.a包都支持什么架构&#xff1a;li…

iOS的事件分发

移动平台上的开发主要关注数据以及数据的处理&#xff0c;事件的处理以及UI。所以事件的分发处理是很重要的一个环节&#xff0c;对于一个平台的优劣来说也是一项重要的参数。如果事件的分发设计的不好&#xff0c;一些复杂的UI场景就会变得很难写甚至没法写。从小屏没有触摸的…

iOS开发ARC入门和使用

本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容&#xff0c;仅用于技术交流和讨论。请不要将本文的部分或全部内容用于商用&#xff0c;谢谢合作。 欢迎转载本文&#xff0c;但是转载请注明本文出处&#xff1a;http://www.onevcat.com/2012/06/arc-hand-by-han…

UIBezierPath 的使用介绍

使用UIBezierPath类可以创建基于矢量的路径。此类是Core Graphics框架关于path的一个封装。使用此类可以定义简单的形状&#xff0c;如椭圆或者矩形&#xff0c;或者有多个直线和曲线段组成的形状。1.Bezier Path 基础UIBezierPath对象是CGPathRef数据类型的封装。path如果是基…

iOS中的XML解析

解析方式分类: 解析 XML 通常有两种方式&#xff0c;DOM 和 SAX&#xff1a;DOM解析XML时&#xff0c;读入整个XML文档并构建一个驻留内存的树结构&#xff08;节点树&#xff09;&#xff0c;通过遍历树结构可以检索任意XML节点&#xff0c;读取它的属性和值。 iOS中XML解析是…

iOS中的JSON解析

一、在iOS中&#xff0c;JSON的常见解析方案有4种&#xff08;1&#xff09;第三方框架&#xff1a;JSONKit、SBJson、TouchJSON&#xff08;性能从左到右&#xff0c;越差&#xff09; &#xff08;2&#xff09;苹果原生&#xff08;自带&#xff09;&#xff1a;NSJSONSeria…

iOS中NSLog的优化使用

一、概述&#xff1a;Debug模式下输出日志&#xff0c;Release模式下自动屏蔽日志输出。通过宏定义实现。二、代码如下&#xff1a;#ifndef __OPTIMIZE__ #define DLog(fmt, ...) NSLog(("%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) #else…

iOS中bundle的使用

一、概述1.在我们使用第三方框架时&#xff0c;常常看到XXX.bundle的文件。我们找到该文件&#xff0c;显示包内容&#xff0c;大致看到很多资源文件&#xff1a;图片、配置文本、XIB文件……2.什么是Bundle文件&#xff1a;简单理解&#xff0c;就是资源文件包。我们将许多图片…

NSRunloop小总结

一、概述1.Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环&#xff0c;用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作&#xff0c;没有的时候休眠。2.Run loop的管理并不完全是自动的。你仍必须设计你的线程代码以…

NSURLProtocol概述

一、概念 NSURLProtocol也是苹果众多黑魔法中的一种&#xff0c;使用它可以轻松地重定义整个URL Loading System。当你注册自定义NSURLProtocol后&#xff0c;就有机会对所有的请求进行统一的处理&#xff0c;基于这一点它可以让你&#xff1a; 1.自定义请求和响应 2.提供自定义…

使用NSURLProtocol实现离线缓存

一、说明&#xff1a;NSURLProtocol可以拦截任何网络请求&#xff0c;包含UIWebView中发出的所有请求。但是在WKWebView中&#xff0c;只能拦截到最初始的请求&#xff0c;内嵌的资源下载拦截不到。比如通过WKWebView加载"http://www.baidu.com",则只能拦截到"h…