這篇文章是去年寫的,我們的兩款app一直這使用umeng的更新服務,但是16年umeng開始放棄更新服務,考慮到切換到其他更新平臺也會面臨這樣的問題,我開始著手自己搭建一個更新平臺。整體方案包含前后端,客戶端代碼封裝成jar包并上次maven平臺,方便每個app直接使用;服務端代碼用nodejs來快捷實現。
1、系統結構
(1)整體結構
整體結構
服務端的各個模塊描述如下:
- WebConsole:提供上傳更新包、配置更新策略的網站操作界面。
- FS:文件系統,存儲文件及提供下載服務。
- DB:用于更新策略及更新信息,例如版本號,更新描述,文件的md5等。
- Server:接收客戶端請求,返回更新信息。
(2)WebConsole結構
WebConsole結構
WebConsole的各個模塊描述如下:
- 應用管理:創建應用、管理應用基本信息、管理應用的版本列表(包括versionCode、versionName、發版日期等) 。
- 更新應用:選擇應用上傳更新包,配置更新信息及策略。
- 任務管理:管理更新任務、定時任務。一個app有且只有一個運行中的更新任務,可以有多個定時任務。
- 測試機管理:查看管理測試機列表,用于。測試機的標識是以deviceId及MAC地址為判斷依據。
- 用戶管理:管理用戶權限。
- 操作日志:查看管理操作日志。
2、 服務端流程
(1)在WebConsole配置更新信息和策略及上傳更新包。將更新信息及策略保存至DB,將更新包保存至FS。
更新信息:版本(versionName,versionCode)、大小、包名、MD5、簽名SHA1、更新日志等。其中版本、大小、包名、MD5、簽名SHA1信息可通過對上傳文件解析自動得到,并且通過對比包名和簽名SHA1(忽略大小寫)判斷上傳文件是否合法?。
更新策略:
1)低版本強制更新:設定一個版本(versionCode),在這個版本及之前版本的app必須進行更新。
2)定時更新:設定一個時間,到時自定啟動更新任務。注意在后臺有且只有一個運行中的更新任務,當啟動新任務則之前的任務自動取消。但是創建一個定時任務,在到時之前上一個運行中的更新任務依然有效。
3)測試階段:默認開啟,用于正式更新前進行更新測試,可在任務管理進行切換。當開啟測試階段,只有在測試機列表中的才會進行更新。
(2)客戶端請求Server,傳入客戶端的包名、版本等信息。Server與DB存儲的信息比較,如果需要更新則返回更新包的url及更新信息,否則返回不更新。
Server流程
驗證請求:主要驗證客戶端的請求參數。首先驗證參數齊全切不為空,否則為無效請求;然后通過包名和簽名SHA1(忽略大小寫) 判斷是否為官方應用,非官方應用不允許更新,返回非官方錯誤碼。
對比版本:判斷客戶端是否為最新版本,是則無需升級。
測試階段:判斷更新任務是否是測試階段。如果是測試階段則判斷客戶端是否為測試機,是則升級,否則不升級。
強制更新:判斷客戶端版本是否不高強制更新的版本,是則進行強制更新,否則非強制更新。
3、交互協議
Request:
{
"pkgName": "com.xxx.xxx",
"versionCode": 1,
"versionName": "1.0.0",
"signedSHA1": "xx:xx:xx:xx:xx",
"deviceKey": "xxxxxxx"
}
其中signedSHA1的校驗注意忽略大小寫;deviceKey用于判斷測試機,由deviceId和MAC地址組合而成的唯一校驗碼
Response:
{
"update": true,
"msgCode": 1,
"msg": "已是最新",
"data": {
"pkgName": "com.xxx.xxx",
"versionCode": 2,
"versionName": "1.0.2",
"updateInfo": "優化xxxx",
"signedSHA1": "xx:xx:xx:xx:xx",
"forceVersion": 1,
"forceUpdate": false,
"apkSize": 123143,
"md5": "xxxxxxx",
"apkUrl": "http://www.xxx.xxx/xx.apk"
}
}
其中msgCode和msg是沒有更新的原因;forceUpdate是否強制更新;forceVersion表示這個版本及之前版本的app都需要強制更新,只是forceUpdate的一個補充;signedSHA1和md5的校驗注意忽略大小寫。
msgCode-msg:
0-更新
1-已是最新版本
2-更新請求失敗,請重試。
3-非官方應用,請卸載后到官網下載安裝。
4-新版本馬上到來,請稍后再試。(測試階段)
4、客戶端流程
(1)非官方應用:彈出不可關閉的提示彈窗,提示用戶卸載當前應用,去官網下載官方版本。
(2)手動更新:app啟動會自動檢查更新,另外用戶可以在設置中手動檢查更新。手動檢查更新結果必須反饋給用戶,自動檢查更新要保證不影響用戶操作。
(3)忽略更新:讀取本地存儲,判斷用戶是否已經忽略本版本。
(4)強制更新:彈出不可關閉的提示彈窗,提示版本過低,必須更新后使用。
(5)正常更新:提供更新、取消兩種操作及忽略選項。選中忽略取消更新則在本地進行存儲。
(6)下載校驗:校驗文件的大小、md5,保證文件的合法性正確性。如果校驗失敗則刪除已下載文件。