介绍一下ionic4 app的自动更新。ionic 很少介绍了,后面一个后系列,背负着骂名的ionic其实仍是能够的,若是刚入门ionic可能以为很坑,可是呢,日后你就发现另一件事,那就是其余的混合app的坑不比它少。php
为何这么说呢? 主要就是兼容,你作不一样的应用,就须要某一方面作优化,那么ionic 天然不能知足你,你须要的就是填坑,那么来介绍一下ionic 如何自动版本更新。android
有3个插件你须要看的:数据库
https://ionicframework.com/docs/native/file
https://ionicframework.com/docs/native/file-opener
https://ionicframework.com/docs/native/file-transferc#
若是你阅读完了这些,那么你能够往下了,若是没有,那么最好阅读一下。api
file-transfer 用来下载你的app,存放位置须要用到file,file-opener 用来打开app。服务器
this.fileOpener.open(apk, 'application/vnd.android.package-archive') .then((e) => { console.log('File is opened', e); }) .catch(e => { console.log('Error openening file', e); });
apk 为你下载的地址。app
这个file 用来干什么的呢?这个file 用来查看该app 的私有目录的地址。具体看文档。 好了,那么如今就知道如何去写这个下载了。ionic
其实就这么一个流程,就是下载好你的app,而后按照某种格式打开便可。优化
那么有一个问题,就是如何让app 知道啥时候更新,啥时候不更新呢?固然是调用api呢。this
那么问题来了,是进入app就开始调用吗? 固然不是,要在用户登陆后时候开始调用,这样避免服务器频繁的调用,只对用户保持更新通知。
那么app 版本的数据库控制的数据库该如何设计呢?
咱们能够看到通常app 都有新版本号,旧版本号,包的大小,包下载的地址,更新内容,是否强制更新,建立时间,更新时间,状态。
咱们通常传入版本号给后台,后台经过和就版本的匹配,通知app更新的版本。
那么有一个问题,就是咱们在传入后台的版本号的时候,后台应该作通配符处理。
好比说,数据库里面旧版本是1..2 表的是中间 版本不管是任何数字都应该更新到对应数据库的那一条的新版本上。
再好比说1.2,3.2 更新,那么更新的是1.2.2 或者1.3.2更新。
好比说1.11-15.2,那么匹配更新的为1.11.1 到1.15.2都应该进行更新,那么通配符代码如何写呢?当时我参考了php,后面是用c#写的,这里我贴一下php代码。
class Version { /** * 检测版本是否的版本要求的数据中 * * @param string $version * @param array $data 数据库里面有多少旧版本须要更新,统一匹配一下 * @return bool */ public static function check($version, $data = []) { //版本号以.分隔 $data = is_array($data) ? $data : [$data]; if ($data) { if (in_array("*", $data) || in_array($version, $data)) { return true; } $ver = explode('.', $version); if ($ver) { $versize = count($ver); //验证容许的版本 foreach ($data as $m) { $c = explode('.', $m); if (!$c || $versize != count($c)) { continue; } $i = 0; foreach ($c as $a => $k) { if (!self::compare($ver[$a], $k)) { continue 2; } else { $i++; } } if ($i == $versize) { return true; } } } } return false; } /** * 比较两个版本号 * * @param string $v1 * @param string $v2 * @return boolean */ public static function compare($v1, $v2) { if ($v2 == "*" || $v1 == $v2) { return true; } else { $values = []; $k = explode(',', $v2); foreach ($k as $v) { if (strpos($v, '-') !== false) { list($start, $stop) = explode('-', $v); for ($i = $start; $i <= $stop; $i++) { $values[] = $i; } } else { $values[] = $v; } } return in_array($v1, $values) ? true : false; } } }
若是不知道php的人,在这里介绍一下continue 2,是什么意思。
拿下面这一段来讲:
foreach ($data as $m) { $c = explode('.', $m); if (!$c || $versize != count($c)) { continue; } $i = 0; foreach ($c as $a => $k) { if (!self::compare($ver[$a], $k)) { continue 2; } else { $i++; } } if ($i == $versize) { return true; } }
continue 2的意思是跳出两层循环。就是里面的foreach 不执行了,而后外面的foreach 跳过本次循环,也就是:
if ($i == $versize) { return true; }
也不执行了。具体来讲,就是最外层的foreach 丢弃本次循环。2表示层数,其余的就很好理解了。