Ionic实现iOS与Android端代码『热更新』

简介: 热更新的好处通常ionic源码可包括(HTML,JavaScript,CSS文件和其他资源),往常我们必须通过提交程序到应用市场,经过漫长的审核后才可让用户更新,每改动一个小地方都需要重新打新版本。

热更新的好处
通常ionic源码可包括(HTML,JavaScript,CSS文件和其他资源),往常我们必须通过提交程序到应用市场,经过漫长的审核后才可让用户更新,每改动一个小地方都需要重新打新版本。

现在ionic通过使用cordova插件cordova-hot-code-push实现实现iOS与Android端代码『热更新』功能,可不必发布应用市场经平台审核,便可动态更新App源码的目的。

热更新实现原理

img_7166cfeb1fd0d62ffa2691f5c9c2ab2e.png
这里写图片描述

基础实现方法
1、安装 cordova-hot-code-push-cli

使用命令安装

npm install -g cordova-hot-code-push-cli

主要是生成检测配置文件,通常是在 www 目录下动态生成 chcp.json 和 chcp.manifest 生成两个文件,插件源码地址:

https://github.com/nordnet/cordova-hot-code-push

2、创建项目

包含 www 目录的项目,已有项目无需重新创建

3、安装热更新插件

使用命令安装

ionic plugin add cordova-hot-code-push-plugin
ionic plugin add cordova-hot-code-push-local-dev-addon

4、打包封装

执行命令cordova-hcp build 或者 cordova build

5、启动 hcp server 服务

重新打开一个终端窗口,cd到项目目录(包含www目录的父级目录)执行命令

cordova-hcp server

稍等会在 www 目录下动态生成 chcp.json 和 chcp.manifest 生成两个文件

6、正常在运行完成前4步以后会在我们config.xml动态加入如图所示链接地址

[图片上传失败...(image-6c20b3-1518154503982)]

[图片上传失败...(image-8f9793-1518154503982)]

图中链接地址https://1980480f.ngrok.io/chcp.json,修改为在第8步www目录里chcp.json文件可访问的地址:

例如:http://kaibin.me/hotcode/chcp.json

7、运行代码或打包我们的App

8、修改我们想要更新的代码

然后修改 chcp.json 文件的 content_url ,此地址为我们项目放置的地址

{
  "autogenerated": true,
  "release": "2016.07.17-11.36.13",
  "content_url": "http://kaibin.me/hotcode",
  "update": "now"
}

9、将项目www目录代码上传到服务器可访问的目录里

例如在服务器根目录创建hotcode命名的目录将项目www里的文件上传上去

10、 关闭我们的应用重新打开,看看代码是否更新成功

优化流程
1.创建cordova-hcp模板

线上测试可卸载掉 cordova-hot-code-push-local-dev-addon防止每次自动更新新版本,可通过命令卸载:

cordova plugin remove cordova-hot-code-push-local-dev-addon

可以在 cordova 项目根目录下放一个 cordova-hcp.json,这是个模板文件
这样每次执行

cordova-hcp build

就会利用这个模板生成新的 chcp.json,而不用手动更改 www/chcp.json了。
cordova-hcp.json内容如下:

{
  "autogenerated": true,
  "content_url": "http://kaibin.me/hotcode",
  "min_native_interface": 1, // app内核版本号
  "ios_identifier": "https://itunes.apple.com/cn/app/***", // iOS上线后的地址,用于内核版本更新后的确认跳转
  "update": "now"
}

2.Build options build设置,配置开发环境、测试环境与生产环境

在 /Cordova/Testproject/ 下创建 chcpbuild.options 文件,文件内容如下:

{
  "dev": {
    "config-file": "https://dev.kaibin.me/hotcode/www/chcp.json"
  },
  "production": {
    "config-file": "https://kaibin.me/hotcode/chcp.json"
  },
  "QA": {
    "config-file": "https://test.kaibin.me/hotcode/chcp.json"
  }
}

这样在build app的时候, 转为开发要用的服务器, 可执行:

ionic build -- chcp-dev

结果就是, 特定拍下的 config.xml 文件(比如, /Cordova/TestProject/platforms/android/res/xml/config.xml) 变成了这样:

<chcp>
  <config-file url="https://dev.kaibin.me/hotcode/chcp.json"/>
</chcp>

当我们需要上架app的时候 (Google Play, App Store) - 我们正常build:

ionic build --release

这样 config.xml 不会改变

如果没有使用 chcpbuild.options 插件会使用 config.xml 里面默认的值。

文件必须位于 Cordova 项目根目录. 在这个文件里面,指定(JSON格式) 所有想改变 config.xml 文件的配置,源文件 config.xml (Cordova项目根目录) 不会发生变动, 改变的是 特定平台下的 config.xml (在cordova build过程的 after_prepare 阶段)。

通过min_native_interface监控app是否提示更新

所需最小的外壳app版本. 这是app的build版本号,是个整型数字, 不是应用商店中看到的形如”1.0.0”字符串。

在 config.xml中,这样指定build版本号:

<chcp>
    <native-interface version="1"/>
    <config-file url="http://kaibin.me/hotcode/chcp.json"/>
</chcp>

与www目录下的chcp.json里面的min_native_interface数值相对应

例如:app外壳里的config.xml是这样的:

<chcp>
    <native-interface version="1"/>
    <config-file url="http://kaibin.me/hotcode/chcp.json"/>
</chcp>

若服务器里的min_native_interface也对应是1,不会出现提示用户升级的状态,正常修改www目录的内容通过更新release值,可实现热更新。

{ 
 "autogenerated": true,
 "content_url": "http://kaibin.me/hotcode", 
 "min_native_interface": 1, // app内核版本号
 "ios_identifier": "https://itunes.apple.com/cn/app/***", // iOS上线后的地址,用于内核版本更新后的确认跳转
 "release": "2017.07.17-12.22.11",
 "update": "now"
}

假设你的外壳app加了个新的插件,应该会更新外壳app。为了防止用户通过热更新下载了不适合他现有外壳app的web内容,你应该设置 min_native_interface 这个值

{ 
 "autogenerated": true,
 "content_url": "http://kaibin.me/hotcode",
 "min_native_interface": 1, // app内核版本号
 "ios_identifier": "https://itunes.apple.com/cn/app/***", // iOS上线后的地址,用于内核版本更新后的确认跳转 
 "release": "2017.07.17-12.28.21",
 "min_native_interface": 2,
 "update": "now"
}

插件加载到这段json的时候, 发现 min_native_interface 比当前外壳app的build号要大,便不会下载web内容。而是触发一个chcp_updateLoadFailed 错误通知, 告诉用户需要升级外壳app了。

chcp.json中update字段含义

指定了什么时候安装web内容更新,支持的值有:

start - app启动时安装更新,默认值
resume - app从后台切换过来的时候安装更新
now - web内容下载完毕即安装更新

引导用户去应用商店更新外壳app或下载新版本
通过给web更新设置最小支持的外壳app版本 min_native_interface。 如果插件检查发现用户安装的外壳app版本比服务端新的web内容要求的版本要低,就会触发错误事件,错误码:

chcp.error.APPLICATION_BUILD_VERSION_TOO_LOW

通过这个错误码可通过弹窗提示用户去升级,跳转到AppStore或下载新安装包(国内因GFW,跳转到google应用商店就算了= =)

chcp.json 里增加min_native_interface的值

js端监听相应事件,并在出现错误的时候调用 chcp.requestApplicationUpdate 方法

cordova-plugin-file,cordova-plugin-file-transfer,cordova-plugin-file-opener2先把这几个插件安装好

var appUpdate = {
        // Application Constructor
        initialize: function() {
            this.bindEvents();
        },
        // Bind any events that are required.
        // Usually you should subscribe on 'deviceready' event to know, when you can start calling cordova modules
        bindEvents: function() {
            document.addEventListener('deviceready', this.onDeviceReady, false);
            document.addEventListener('chcp_updateLoadFailed', this.onUpdateLoadError, false);
        },
        // deviceready Event Handler
        onDeviceReady: function() {
        },
        onUpdateLoadError: function(eventData) {
            var error = eventData.detail.error;

            // 当检测出内核版本过小
            if (error && error.code == chcp.error.APPLICATION_BUILD_VERSION_TOO_LOW) {
                var dialogMessage = '有新的版本,请下载更新';

                // iOS端 直接弹窗提示升级,点击ok后自动跳转
                if(ionic.Platform.isIOS()){
                    chcp.requestApplicationUpdate(dialogMessage, this.userWentToStoreCallback, this.userDeclinedRedirectCallback);
                // Android端 提示升级下载最新APK文件
                }else if(ionic.Platform.isAndroid()){
                    var confirmPopup = $ionicPopup.confirm({
                        template: '有新的版本,请下载更新',
                        cssClass: 'popup',
                        cancelText:'取消',
                        okText:'升级'
                    });
                    confirmPopup.then(function (res) {
                        if (res) {
                            $ionicLoading.show({
                                template: "已经下载:0%"
                            });
                            window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function(fileEntry) {
                                fileEntry.getDirectory("***(app名称)", { create: true, exclusive: false }, function (fileEntry) {
                                    //下载代码
                                    var fileTransfer = new FileTransfer();
                                    fileTransfer.download("app下载地址", fileEntry.toInternalURL()+"***(app名称).apk", function(entry) {
                                        // 打开下载下来的APP
                                        cordova.plugins.fileOpener2.open(
                                            entry.toInternalURL(),//下载文件保存地址
                                            'application/vnd.android.package-archive', {//以APK文件方式打开
                                                error: function(err) {
                                                },
                                                success: function() {}
                                            });
                                    }, function(err) {
                                    },true);
                                    fileTransfer.onprogress = function(progressEvent) {
                                        $timeout(function () {
                                            var downloadProgress = (progressEvent.loaded / progressEvent.total) * 100;
                                            $ionicLoading.show({
                                                template: "已经下载:" + Math.floor(downloadProgress) + "%"
                                            });
                                            if (downloadProgress > 99) {
                                                $ionicLoading.hide();
                                            }
                                        });
                                    };
                                },function(err){alert("创建失败")});
                            });
                        }
                    });
                }
            }
        },
        userWentToStoreCallback: function() {
            // user went to the store from the dialog
        },
        userDeclinedRedirectCallback: function() {
            // User didn't want to leave the app.
            // Maybe he will update later.
        }
    };
    appUpdate.initialize();

iOS与Android的出现的问题
在build ios的app时config.xml的

<name>***</name>

name不可使用中文,设置app名称为中文,可通过Xcode修改Resources目录下的***-Info.plist内的Bundle display name字段即可

感谢分享:http://kaibin.me/2016/07/17/ionic-hotcode/

相关文章
|
8天前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
17天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
27天前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
30天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
24 1
|
18天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
1月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
29 2
|
3月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
40 3
|
2月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
152 0
|
3月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
153 0