介紹一下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表示層數,其餘的就很好理解了。