iOS 混合开发之 Cordova 实践
在15年时,之前公司使用 Cordova 做混合开发使用,后来公司没有用到了,现在重新记录下。
Cordova (官网:http://cordova.apache.org/)简介:
Apache Cordova 是一个开源移动开发框架,可以使用标准的Web 技术 HTML5、CSS3、JavaScript用来开发跨平台的移动应用。架构图如下(来源官网):
大致分为 Web 端的工作原理和 Native 端的工作原理。
Web 端,主目录下有 Config.xml 和 www 文件夹。Config.xml 文件包含了 APP 配置信息:App 名称、入口index文件、插件、白名单、WebView 初始化的配置信息、Icon 图标等。
Native 端有 CDVViewController、CDVUIWebViewEngine。
其中,CDVViewController 中:
init 初始化程序;
loadSettings 解析Config.xml 文件,将 pluginsMap startPlugin setting startpage 变量初始到容器 controller 中初始化 plugin 字典;
ViewDidLoad 先loadSettings,之后创建特殊存储空,根据CDVUIWebViewEngine初始化Webview,然后获取appURL加载index.html。
在 CDVUIWebViewNavigationDelegate中,- (BOOL)webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
- (void)fetchCommandsFromJs
{
__weak CDVCommandQueue* weakSelf = self;
NSString* js = @"cordova.require('cordova/exec').nativeFetchMessages()"; [_viewController.webViewEngine evaluateJavaScript:js
completionHandler:^(id obj, NSError* error) {
if ((error == nil) && [obj isKindOfClass:[NSString class]]) {
NSString* queuedCommandsJSON = (NSString*)obj;
CDV_EXEC_LOG(@"Exec: Flushed JS->native queue (hadCommands=%d).", [queuedCommandsJSON length] > );
[weakSelf enqueueCommandBatch:queuedCommandsJSON];
// this has to be called here now, because fetchCommandsFromJs is now async (previously: synchronous)
[self executePending];
}
}];
}
工程大致目录结构如下:
myapp/
|-- config.xml
|-- hooks/
|-- merges/
| | |-- android/
| | |-- windows/
| | |-- ios/
|-- www/
|-- platforms/
| |-- android/
| |-- windows/
| |-- ios/
|-- plugins/
|--cordova-plugin-camera/
安装实践如下:
1、安装Cordova: Terminal 输入:$ npm install -g cordova
2、创建工程:$ cordova create + [目录名称,必填] + boundle ID + 工程名称
例如:$ cordova create CordovaProject com.sh5i5j.CordovaApp CordovaApp
在 CordovaProject 目录下新建一个 boudle identifier 为 "com.sh5i5j.CordovaApp" 的工程 CordovaApp 的项目
3、添加平台:
进入刚才创建的目录:$ cd CordovaProject
添加对应平台:
$ cordova platform add browser (添加浏览器平台)
$ cordova platform add ios (添加iOS平台)
$ cordova platform add android (添加android平台)
更多可参看支持平台:http://cordova.apache.org/docs/en/latest/guide/support/index.html
添加完成后在 ~/CordovaProject/Platforms 目录下会有对应的 Cordova 工程
4、启动对应工程:cordova run ios/android/browser
5、安装检查是否成功
6、添加插件:
自定义插件:
新建文件继承自 CDVPlugin。引入头文件 #import <Cordova/CDVPlugin.h>,添加交互方法 "hybridAction"
#import "ZTBPlugin.h" @implementation ZTBPlugin #pragma mark - 交互行为
- (void)hybridAction:(CDVInvokedUrlCommand *)command{
if (command.arguments.count>) {
//customize argument
NSLog(@"===== %@", command.arguments);
}else{
//callback
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"没有参数"];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
} @end
hybridAction 名字与自定义 “ZTBPlugin”文件中方法名字相同。
Config.xml 配置中:添加:
<feature name="iOSHybridActionPlugin">
<param name="ios-package" value="ZTBPlugin" />
</feature>
其他自带插件安装:cordova plugin add cordova-plugin-插件名称
$ cordova plugin add cordova-plugin-
battery-status (添加 Battery Status 插件)
$ cordova plugin add cordova-plugin-
camera
(添加 camera
插件)
$ cordova plugin add cordova-plugin-
console (添加 console 插件)
$ cordova plugin add cordova-plugin-
contacts (添加 contacts 插件)
$ cordova plugin add cordova-plugin-device
(添加 device 插件)
$ cordova plugin add cordova-plugin-
device-motion (添加 device motion 插件)
更多插件请移步:http://cordova.apache.org/docs/en/latest/reference/cordova-plugin-device-motion/index.html
添加成功后,会在 Config.xml 文件中自动插入对应插件配置文件。
代码链接:CordovaApp
======== 后续 =========
向原来工程中添加 Cordova 时,如果出现了头文件找不到的错误提示时:'Cordova/CDVViewController.h' file not found
可以尝试在Xcode->Build setting-> header search paths 添加:"$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include"
如果此时还是报错,那么将 Xcode->Build phases->Link Binary with Libraries 中添加 libCordova.a。
iOS 混合开发之 Cordova 实践的更多相关文章
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...
- Android混合开发之WebView与Javascript交互
前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...
- UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)
最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...
- UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)
前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...
- UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件
在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...
- Android混合开发之WebView使用总结
前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS多线程开发之NSOperation - 快上车,没时间解释了!
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- iOS游戏开发之UIDynamic
iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...
随机推荐
- 软件工程2020第一次作业(by cybersa)
1 作业描述 作业属于哪个课程 2020春福大软工实践W班 这个作业要求在哪里 寒假作业(1/2) 这个作业的目标 建立博客.掌握markdown语法,学习写博客,回顾,总结,展望自己的学习历程 作业 ...
- Python六剑客
1.切片 切片:截取可迭代对象的部分内容(list,tuple,dict,set,str) 2.列表解析式 列表解析式可以快速的生成一个列表 不带if条件的: 格式:[expression for i ...
- Python - 将iterable拆分成等长的数据块
说明 看文档发现一个有趣的应用(利用zip函数) 例如[1, 2, 3, 4] --> [(1, 2), (3, 4)],拆分成长度为2的数据块 Code >>> a = [1 ...
- Git 常用命令总结,掌握这些,轻松驾驭版本管理
原创 最近公司的代码管理工具要从SVN转到Git上,因此虽然之前用过Git,但是都是一些简单的推送提交,因此还是有必要进行一些系统的学习,这里做一下笔记,以备后询,且不定期更新. 关于SVN和Git的 ...
- 概率dp poj 3071
题目首先给出一个n,表示比赛一共进行n轮,那么队伍就有2^n只队伍输入一个2^n*2^n的矩阵,p[i][j]代表队伍i打败队伍j的概率dp[i][j]代表第i轮比赛的时候,队伍j赢的概率首先初始化时 ...
- Spring-Aop编程(三)-AspectJ
AspectJ 1. 介绍 AspectJ是一个基于Java语言的AOP框架,Spring2.0以后新增了对AspectJ切点表达式支持,@AspectJ 是AspectJ1.5新增功能,通过JDK5 ...
- Centos610-Nginx-TCP代理配置
1.安装Nginx 详见<nginx>安装 2.下载nginx_tcp_proxy_module模块 下载 wget https://github.com/yaoweibin/nginx ...
- Angular的启动过程
我们知道由命令 ng new project-name,cli将会创建一个基础的angular应用,我们是可以直接运行起来一个应用.这归功与cli已经给我们创建好了一个根模块AppModule,而根模 ...
- Python学习之Craps赌博游戏篇
在此先安利一波大佬的Python学习项目地址:https://github.com/jackfrued/Python-100-Days 这些天一直在看着大佬的项目学习Python,这是第五天循环学习完 ...
- python中字符串的四种表达方式
今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 > ...