最近准备尝试hybird开发原生应用,因为公司的项目本来就是原生开发的,所以准备选择cordova作为webview嵌入原生项目的开发方式。这里就以mac上整合ios项目为例。

1. 创建cordova项目

1)安装cordova:

sudo npm install -g cordova

2)创建cordova项目:

cordova create hello com.example.hello HelloWorld

这里hello是目标目录名,HelloWorld是项目名称,com.example.hello是项目ID。

创建的项目会包含一个config.xml文件,在这里可以修改项目名称和项目ID以及其他的配置。项目还会包含一个www文件夹,其下包含index.html和css,js,img这些资源目录。www文件夹就是cordova h5项目的资源目录,其下的文件会被保存在设备的文件系统中,而非通过网络下载。这些css,js,img目录的名称和位置都可以自由变动(只要在www文件夹下)。index.html是单独的cordova项目的入口,也可以在config.xml中配置成其他文件,而在原生/cordova混合项目中也是可以另外配置的,将在之后说到。

3) 添加平台与启动:

cd hello // 切换到项目文件夹下

cordova platform add ios // 添加ios平台

cordova platforms ls // 列出已添加的平台,此时我们已添加了ios平台

cordova run ios // 编译构建ios平台并启动模拟器运行项目

2. 使用cordova插件

使用cordova不仅可以将我们的h5项目包装成原生应用,还能使用各种包装好的插件调用原生接口,或是使用cordova包装好的js bridge来开发自己的插件。接下来就以一个toast插件为例,介绍如何在项目中添加插件。

1) 搜索插件:

可以在 https://cordova.apache.org/plugins/ 这里搜索插件

2)添加插件:

cordova plugin add cordova-plugin-x-toast // 添加 cordova-plugin-x-toast 插件

cordova prepare

这是cordova项目自动安装插件的方式,除此之外还有手动安装的方式,将在之后说到。

3)使用插件:

在页面包含的js中调用:

document.getElementById('toast-btn').addEventListener('click', function () {
    window.plugins.toast.show(
        'Hello there!',
        'long',
        'center',
        function(info){
            console.log('toast success: ' + info)
        },
        function(err){
            alert('toast error: ' + err)
        })
});

3. 将cordova项目整合入ios项目

以上提到的工作流程都是独立的cordova项目,而我们要做的是在原生项目中嵌入cordova项目。接下来就来看看整合流程。

1)添加项目:

使用Xcode将congig.xml和www目录添加到项目代码目录中。

使用Xcode复制.xcodeproj文件到workspace下并设置构建参数。

在Link Binaries with Libraries中添加需要的框架。

在Build Settings中修改Header Search Paths。

以上步骤可以参考文档,让熟悉Xcode的原生项目开发童鞋来搞一搞,其实这一块的步骤我也不太懂,是原生的小伙伴配置的(不太会用Xcode T_T)。

添加完之后的目录结构类似于:

- 根目录
  - 项目代码目录
    - config.xml
    - www目录
    ...
  - .xcworkspace文件
  - .xcodeproj
  ...

2)使用CDVViewController:

在需要使用cordova webview的地方添加代码:

#import <Cordova/CDVViewController.h> // 导入CDVViewController头文件

CDVViewController* viewController = [CDVViewController new]; // 创建CDVViewController实例

viewController.wwwFolderName = @"anotherForder"; // 设置h5文件目录,不设默认就是www目录

viewController.startPage = @"html/page1.html" // 之前提到的,除了config.xml之外,我们还可以在这里设置启动页,不同的CDVViewController实例可以设置不同的启动页

[myView addSubview:viewController.view]; // 将我们的cordova webview显示出来

3)添加插件:

然后是添加插件这一步,需要用手动添加的方式。

回到我们之前的独立cordova项目,我们可以看到在项目目录下的platforms/ios文件夹下也有一个www文件夹,除了我们原本的文件之外,还有一些额外的文件。其中包括指定插件引用的cordova_plugins.js,包含插件js代码的plugins文件夹,我们需要将这两项复制到混合项目的www文件夹下。(cordova_plugins.js是全局插件的配置,因此我们可以在页面中单独包含插件的js文件,而不必将配置添加到cordova_plugins.js)

接下来,修改config.html文件,在feature标签中添加Toast插件:

<feature name="Toast">
    <param name="ios-package" value="Toast" />
</feature>

最后还要将独立项目目录下platforms/ios/[项目名称]文件夹下的Plugins文件夹用Xcode复制到混合项目的代码目录下。最后,混合项目的目录结构应该类似于:

- 根目录
  - 项目代码目录
    - config.xml
    - www目录
      - plugins目录(插件js文件)
      ...
    - Plugins目录(插件.h/.m文件)
    ...
  - .xcworkspace文件
  - .xcodeproj
  ...

4. 自动更新的cordova h5项目

cordova混合项目的优势之一是h5项目我们可以绕过App Store更新代码。这里我们使用cordova-app-loader插件。

1)添加插件:

cordova plugin add org.apache.cordova.file
cordova plugin add org.apache.cordova.file-transfer

2)下载CordovaAppLoader的js文件(包含Promise插件bluebird.js,Cordova文件插件cordova-promise-fs.js,manifest下载更新插件cordova-app-loader.js):

cordova-app-loader-complete.js

3)添加初始manifest文件,并添加初始资源文件:

manifest.json:

{
    "files": { // 需要下载的文件
        "cordova-app-loader-complete": {
            "version": "76f1eecd3887e69d7b08c60be4f14f90069ca8b8",
            "filename": "cordova-app-loader-complete.js"
        },
        "autoupdate": {
            "version": "76f1eecd3887e69d7b08c60be4f14f90069ca8b8",
            "filename": "autoupdate.js"
        },
        "template": {
            "version": "3e70f2873de3d9c91e31271c1a59b32e8002ac23",
            "filename": "template.html"
        },
        "app": {
            "version": "8c99369a825644e68e21433d78ed8b396351cc7d",
            "filename": "app.js"
        },
        "style": {
            "version": "6e76f36f27bf29402a70c8adfee0f84b8a595973",
            "filename": "style.css"
        }
    },
    "load": [ // 启动时包含的文件
        "cordova-app-loader-complete.js",
        "autoupdate.js",
        "app.js",
        "style.css"
    ]
}

4)引用manifest文件:

在.html文件中添加:

<script type="text/javascript" server="http://data.madebymark.nl/cordova-app-loader/"  manifest="manifest.json" src="bootstrap.js"></script>

在deviceready后,manifest.json指定的css/js文件会被添加到页面。

5)更新manifest及文件:

初始化CordovaAppLoader:

var CordovaPromiseFS = require('cordova-promise-fs');
var CordovaAppLoader = require('cordova-app-loader');
var Promise = require('bluebird');

var fs = new CordovaPromiseFS({
    Promise: Promise
});

var loader = new CordovaAppLoader({
    fs: fs,
    serverRoot: 'http://example.com/',
    localRoot: 'app',
    cacheBuster: true,
    checkTimeout: 10000
});

比对manifest文件并更新:

loader.check().then(function(updateAvailable) { ... }); // 检查localStorage中的manifest与http://example.com/manifest.json的差别

loader.download(onprogress).then(function(manifest){ ... },function(failedDownloadUrlArray){ ... }); // 按照更新的manifest文件更新下载新的依赖,下载的文件将被保存到设备的本地存储

loader.update(); // 重新加载页面
loader.update(false); // 将manifest保存到localStorage,但不重载页面,内容将在下一次进入是更新

如果新内容加载失败,项目将回退到初始打包的manifest状态。

Hybird应用开发实践(一)使用原生/cordova混合项目的更多相关文章

  1. vue 2.0 开发实践总结之疑难篇

    续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1. ...

  2. Cordova+ionic 开发hybird App --- 开发环境搭建

    Cordova 开发hybird App 开发环境搭建 一.一些基础概念: Ant : 简单说来可以这么理解,如果你用记事本写JAVA程序,然后在cmd里输入javac命令编译它,但是有一天你发现每次 ...

  3. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  4. Android开发:最详细的 Toolbar 开发实践总结

    最详细的 Toolbar 开发实践总结 过年前发了一篇介绍 Translucent System Bar 特性的文章 Translucent System Bar 的最佳实践,收到很多开发者的关注和反 ...

  5. 基于React Native的58 APP开发实践

    React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势.再加上Native的优秀性能,让越来越多的公司 ...

  6. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构   前言 学习Python也有一个半月时间了,学到现在感觉 ...

  7. 升讯威微信营销系统开发实践:(1)功能概要与架构设计( 完整开源于 Github)

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  8. WePY - 小程序敏捷开发实践丨掘金开发者大会

    声明:内容转载他处,如有侵权,可协商下架 本主题虽然在其它地方讲了很多次,但还是有非常多新内容.因为很多东西正在做或者想要做.本次分享主要分为以下几个部分: WePY 的介绍 WePY 的用户 上面展 ...

  9. Angular开发实践(七): 跨平台操作DOM及渲染器Renderer2

    在<Angular开发实践(六):服务端渲染>这篇文章的最后,我们也提到了在服务端渲染中需要牢记的几件事件,其中就包括不要使用window. document. navigator等浏览器 ...

随机推荐

  1. HDU 2167 Pebbles(状压DP)

    题目链接:Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  2. ecos的app生命周期

    5种变迁,安装.更新.启动.暂停.卸载,每个app都可以自行维护每种变迁 方法简单,只需要在app/$app_name目录下定义task.php文件 <?php class desktop_ta ...

  3. ural1521 War Games 2

    War Games 2 Time limit: 1.0 secondMemory limit: 64 MB Background During the latest war games (this s ...

  4. 多机并行计算框架 和CoolHash数据库(可用于多机机器学习)

    http://my.oschina.net/fourinone/blog/289122 http://www.oschina.net/p/fourinone

  5. wireshark tls

    想抓一下openfire的包看看,首先要选loopback接口,如果是在本地测试的话. 然后需要搞到rsa私钥,设置好就可以了. keytool -importkeystore -srckeystor ...

  6. Extraordinarily Tired Students UVA - 12108

    不知道叫什么,好像是模拟的方法,看懂了题就好办(英语硬伤←_←) 题意大概是当一个同学想睡觉的时候判断周围睡觉的人数,不睡的人数大于等于睡觉的话就死撑着,否则就睡觉. 一开始没有什么思路,就直接用了个 ...

  7. Linux 分区和目录

    [1. 分区与目录概念理解]  Linux的分区是物理上的概念,就像我们把一块硬盘分成C:,D:,E:三个区一样,物理上将存储空间分开 Linux的目录是逻辑上的概念,Linux的目录树实际上是一个分 ...

  8. OC语言的特性(二)-Block

    本篇文章的主要内容 了解何谓block. 了解block的使用方法. Block 是iOS在4.0版本之后新增的程序语法. 在iOS SDK 4.0之后,Block几乎出现在所有新版的API之中,换句 ...

  9. eclipse创建Maven父子结构Maven项目

    1.创建聚合模块 选择菜单项 File—>New—>Other,在弹出的对话框中选择Maven下的Maven Project,然后单击Next按钮,在弹出的New Maven Projec ...

  10. CI框架学习——检查用户名与密码是否合法(二)

    检查用户名与密码是否合法 步骤一.编写用户登录的窗体见下面内容 步骤二.编写数据库校验方法 $username = $_POST["username"];            # ...