最近一個需求是在請求參數(shù)中添加判斷是否為升級用戶的字段,簡單來說,當前用戶使用版本為1.1,如果是從0.9或者1.0升級過來則算老用戶,如果是直接安裝的1.1則為新用戶,新用戶升級到1.2后就會自動變?yōu)槔嫌脩簟7椒ū容^多,我這里列舉三種:
借助數(shù)據(jù)庫升級
這是我最先想到的方法, 我們都知道,在數(shù)據(jù)庫的version發(fā)生變化時SQLiteOpenHelper的onUpgrade函數(shù)會被調(diào)用,因此這可以作為判斷升級用戶的隱性標志。但這種方法問題比較多:
- 有些版本升級并不一定會伴隨著數(shù)據(jù)庫的升級,造成數(shù)據(jù)的不準確。
- 在某些特定場景下可能需要在同一版本中做多次數(shù)據(jù)庫升級操作,雖然這并不推薦,但業(yè)務至上的原因,什么樣的代碼都可能存在,還是可能造成數(shù)據(jù)不準確。
手動存儲安裝版本信息
手動存儲版本信息是個性化比較強的一種做法,我們在應用啟動時可以檢測sp中是否紀錄install_version這個值,如果未存在,則將當前版本號寫入,當需要判斷升級用戶時只需要判斷install_version的值與當前版本號是否相等即可。但這同樣存在某些問題:
用戶手動或者程序由于某些原因清除數(shù)據(jù)就會造成數(shù)據(jù)不準確。
對于已發(fā)布的版本似乎無法補救,例如1.1中加的需求,但之前已經(jīng)發(fā)布多個版本。
借助PackageInfo
由于上面兩種自定義的邏輯都不能很好的滿足我的需求,所以我將希望寄托于系統(tǒng),于是翻看了PackageManager相關的代碼,果然在PackageInfo中找到了兩個有用的值:firstInstallTime,lastUpdateTime,根據(jù)注釋的描述,firstInstallTime表示應用第一次安裝的時間,lastUpdateTime表示應用最后一次更新的時間,并且這兩個值由系統(tǒng)維護,清除數(shù)據(jù)也不會影響結(jié)果,所以當firstInstallTime != lastUpdateTime時表示當前為升級用戶。核心代碼如下:
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
return pi.firstInstallTime == pi.lastUpdateTime;
這種方法的確很不錯,但如果需求嚴苛的話,還是會有一些問題,
平級、降級安裝也會更改lastUpdateTime的值,同樣可能造成結(jié)果不準確。
支持的最小版本是9,雖然目前9以下的版本已經(jīng)很少了
總結(jié)
三種方法各有優(yōu)缺點,希望可以給大家一些借鑒作用。如果有更好的方法,歡迎給我留言。