通常我们开发一个app之后,需要把他们放到对应的应用商店上去以供下载。在此期间,需要经过应用商店的审核,包括初次上传和更新上传。短则需要数天,多则需要几个星期,这对于我们的快速产品迭代和hotfix来说就是一个噩梦。Ionic提供了一个方式,能够在应用需要更新的时候,不需要应用商店的审核,而实现实时更新。当然,从技术的角度来看,基于web的产品(HTML+CSS+JS)是可以做到的。但是从商业的角度来看,需要遵守各个应用商店的使用规则,也就是说,或多或少存在一些限制:

  • 初次提交必须通过应用商店的审核,无法避免。
  • 添加或者删除plugin的时候,需要进行审核。
  • 当更新之后,app出现编译型错误的时候,不能实现live updates,需要通过应用商店进行修复之后方可继续使用。
  • 基本上www文件夹下面的更改是可以实现live updates的。

live updates是ionic团队提供的一个service,类似于ionic push等,目前Ionic deploy service是免费的,后续会尝试收费的模式。

步骤如下:

1. Sign up in Ionic io site.

2. Create one app in Ionic io site.

3. Create one app in local.

$ ionic start APPNAME
$ cd APPNAME

4. Add the platform web client

ionic add ionic-platform-web-client

出现了如下错误:

可以运行下面的命令来解决问题:

bower install --save-dev ionic-platform-web-client
ionic install ionic-platform-web-client

如果出现“Ionic is not defined”错误,则需要把下面的代码放在“<script src="lib/ionic/js/ionic.bundle.js"></script>”之后:

<script src="lib/ionic-platform-web-client/dist/ionic.io.bundle.js"></script>

5. Initialize your app into Ionic io

注意:此步骤不要运行多次,否则或产生一系列意想不到的错误。

ionic io init

6. Add ionic deploy service

ionic plugin add ionic-plugin-deploy

7. Implement it in your app

run(function($ionicPopup) {
var deploy = new Ionic.Deploy();
deploy.setChannel("dev");
deploy.watch().then(function() {}, function() {}, function(updateAvailable) {
if (updateAvailable) {
deploy.download().then(function() {
deploy.extract().then(function() {
deploy.unwatch();
$ionicPopup.show({
title: 'Update available',
subTitle: 'An update was just downloaded. Would you like to restart your app to use the latest features?',
buttons: [
{ text: 'Not now' },
{
text: 'Restart',
onTap: function(e) {
deploy.load();
}
}
]
});
});
});
}
});
};

Update info.plist for IOS 9to add exclusion rules to have a workaround for ATS.

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>amazonaws.com</key>
<dict>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>amazonaws.com.cn</key>
<dict>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>

8. Upload the new version of your app into Ionic io: you may try multiple times because some kind of errors could be occurred due to unstable service of Ionic deploy. Make sure the deploy env is same as what you coded in step 7.

ionic upload --note "new version" --deploy=dev

9. Change something of your app, and run above command to upload the changes to Ionic io again.

10. Succeed, now you can see the changes are pushed into mobile device without putting them into app store!

11. Cannot download the updates in mobile device, the error is "no such key from aws.amazonaws.com". No solution till now.

建议:不推荐使用

  • 目前Ionic deploy service处在beta阶段,所以不建议在production上面使用这种方法,也不建议频繁地使用这种方式来进行更新。
  • 想要实现live updates必须现在Ionic io上面注册账号,并且在第一个版本中需要进行一些code层面的配置(针对IOS 9用户来讲,需要绕过ATS机制)。
  • 由于我们上传的app是存储在AWS云上面的,安全、保密性是需要考量的一个点。
  • 在手机上测试好久也没有成功,觉得目前的service非常的不稳定,所以在dev环境下面也不推荐。

What's next then?

参考资料:

第二十一章:deploy and live updates的更多相关文章

  1. JavaScript高级程序设计:第二十一章

    第二十一章 Ajax与Comet 一.XMLHttpRequest对象 1.XHT的用法 在使用XHR对象时,要调用的第一个方法时open( ),它接受3个参数:要发送的请求的类型.请求的URL和表示 ...

  2. 第二十一章 Django的分页与cookie

    第二十一章 Django的分页与cookie 第一课 模板 1.模板的继承 在Template目录下新建模板master.html <!DOCTYPE html> <html lan ...

  3. Gradle 1.12用户指南翻译——第二十一章. Gradle 插件

    昨天晚上只顾着和女朋友看<匆匆那年>电视剧的最后几集,所以说好的Android文档<Gradle 插件用户指南>第五章自然也没翻译多少.所以今天也发不了第五章的翻译了,就发几个 ...

  4. “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java异常第二十一章:finally不被执行的情况

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. “全栈2019”Java第二十一章:流程控制语句中的决策语句if

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(二) controller

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第二十一章-授予身份与切换身份(二) 1.回顾 ...

  8. 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(一) table、entity、service、dao

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第二十一章 授予身份与切换身份(一) 1.使用场景 某个领导因为某 ...

  9. python 教程 第二十一章、 扩展Python

    第二十一章. 扩展Python /* D:\Python27\Lib\Extest-1.0\Extest2.c */ #include <stdio.h> #include <std ...

  10. 20190922 On Java8 第二十一章 数组

    第二十一章 数组 一等对象 对象数组和基元数组在使用上是完全相同的.唯一的不同之处就是对象数组存储的是对象的引用,而基元数组则直接存储基本数据类型的值. 多维数组 Array.deepToString ...

随机推荐

  1. spring的一些配置和重要的接口和类

    spring的配置文件 通常是applicationContext.xml(具体的bean配置会在后面内容中详解) setter方法注入: <property name=“” value=“ja ...

  2. Android中如何下载文件并显示下载进度

    原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Serv ...

  3. win8 附件数据库失败解决方案《1》

    sql server 2005附加数据库错误:尝试打开或创建物理文件 无法打开物理文件 "E:\works\database\northwnd\northwnd.mdf".操作系统 ...

  4. 小程序上传多图片多附件多视频 c#后端

    前言: 最近在研究微信小程序,本人自己是C#写后端的;感觉小程序挺好玩的,就自己研究了一下:刚好今天又给我需求,通过小程序上传多图 然后C#后端保存到服务器: 用NET明白 前端上传需要用到流,然后就 ...

  5. 20165219 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20165219 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:王彦博 学号:20165219 成绩: 指导教 ...

  6. IP地址和子网划分

    前期知识准备 二进制 和十进制 二进制数据是用0和1表示的数,进位规则为缝二进1, 二进制和十进制的关系 二进  十进 0 1 10 2 100  4 1000 8    10000 16 10000 ...

  7. Mysql高性能优化规范建议

    数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意 ...

  8. Postman接口测试之POST、GET请求方法

    一.基础知识 1.HTTP的五种请求方法:GET, POST ,HEAD,OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法. GET请求:请求指定的页面信息,并返回实体 ...

  9. WPF:CheckBox竖向的滑块效果

    原文:WPF:CheckBox竖向的滑块效果 之前做了一个横向的滑块效果,<WPF:CheckBox滑块效果>,其实我觉得那个不好看,今天又做了一个竖向的玩. <Style Targ ...

  10. MapReduce编写的正确姿势

    先看一下目录结构 这里是job接口,负责参数的传递和定时的调用 下面的图是MR 程序相关的目录图片,其中MR的入口程序负责读取数据,并指定对应的Map.Reduce程序. 程序的流程 首先简单的说一下 ...