ionic 4 app 自動版本更新

前言

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

相關文章
相關標籤/搜索