iOS客戶端節日換膚的思考與實現
最近單位的APP來了新的需求,市場說他們要在圣誕節把APP里的圖標都換了,還要換背景圖片,還要給部分view添加一個遮蓋。對,就是換膚。以前沒有搞過換膚,所以考慮了一天,感覺大概就是這么個思路,感覺有問題的大家可以一塊討論。
總體來說主要分為兩個部分:
-
第一部分主要是服務器資源的遠程加載:
資源加載.png
先說一下我們的要求是,一般在活動的前一天或前幾天會提前把資源準備好放在服務器,然后后臺開啟換膚的接口,也就是說爭取在活動開始前確保大多數用戶已經把節日需要的資源下載到了本地,然后服務器接口返回會有此次活動的開始時間以及結束時間。然后在活動期間用戶打開APP的話動態更換資源。暫時不考慮極限情況,例如用戶在活動開始之前始終沒有打開過APP,那么該用戶當天打開APP第一次是不會看到最新的皮膚。
流程圖是剛開始考慮的時候按著當時的思路畫的,具體實現的時候有些許偏差,不過總起來說就是這個邏輯。在APP初次打開時配置關于皮膚的一些參數信息 比如說我們默認把起始時間都定為1970年1月1日,把活動id定為0,以后遞增 反正自我發揮,只要能確保與之后服務器的數據做對比,之后再次打開時只是去讀取之前存好的值,在這里我會有一個換膚服務的一個單例,提供一個只讀屬性來標示現在是否需要更換資源。
@interface ChangeSkinService : NSObject
// 是否允許更換資源
@property (nonatomic, assign, readonly, getter=isShouldChangeSkin) BOOL shouldChangeSkin;
+ (instancetype)sharedInstance;
- (void)configService;
- (NSString *)resourceFile;
@end
如果服務器的版本高于本地的版本,則證明可能有換膚活動,這時需要判斷服務器活動的結束時間,如果這個時間早于當前時間說明這次活動可能已經過期,那么客戶端也就沒有下載資源的必要了。如果這個時間晚于當前時間,則需要下載資源,這里可以給一個資源狀態的標示,用來以防本地的版本已經跟服務器的同步而資源并沒有下載成功的意外情況。事實上,我們可以一直等到資源下載并解壓完成后再更改本地的所有設置,中間如果發生不可預料的錯誤,也可以避免客戶端本地產生臟數據。
-
第二部分主要就是圖片資源的加載了:
圖片加載.png
這部分基本上沒什么操作難點,無非就是運行時更改 + (nullable UIImage *)imageNamed:(NSString *)name; 方法,重寫該方法,在ChangeSkinService單例允許更換資源的情況下,去本地沙盒的Document文件夾中讀取需要的圖片。具體細節可以根據各自業務的不太來制定,大致思路是不變的,比如說你客戶端有的地方的圖片可能會有拉伸之類的需求,但這樣其實是不影響的,因為圖片拉伸的操作底層依然需要調用imageNamed:方法來找到該圖片。
所以,基本也就這樣。如果你有問題也可以留言我們一起討論。