隨著業(yè)務(wù)的延展嘉涌,APP中會出現(xiàn)各類如通知妻熊、營銷、優(yōu)惠信息等等一系列的彈窗仑最,且樣式各異扔役,彈出時機及順序不定,前期如果未做系統(tǒng)性的規(guī)劃警医,到中期就會形成邏輯災(zāi)難亿胸。
我自己的項目中就出現(xiàn)了這樣的問題,在和產(chǎn)品經(jīng)理溝通后得知预皇,后續(xù)此類彈窗只會越來越多侈玄。遂決定對彈窗做系統(tǒng)性規(guī)劃和重構(gòu),一勞永逸深啤。
主體思路是參考了類似英雄聯(lián)盟和王者榮耀這兩個游戲剛啟動時的彈窗邏輯:
前提:后臺有彈窗配置,每個彈窗有一個對應(yīng)id路星、優(yōu)先級溯街、展示人群诱桂、拓展項。
客戶端請求彈窗列表接口后返回一個彈窗數(shù)組呈昔,首先展示第一個彈窗
第一個彈窗彈出后挥等,如果點擊了關(guān)閉,使用彈窗id堤尾,調(diào)用一個finish接口后肝劲,則按順序展示第二個。
第一個彈窗彈出后郭宝,如果點擊了彈窗辞槐,同樣使用彈窗id,調(diào)用一個finish接口后粘室,跳轉(zhuǎn)至對應(yīng)落地頁榄檬,在落地頁返回時,二次調(diào)用彈窗列表接口衔统,此時因第一個彈窗已被finish鹿榜,所以在二次調(diào)用時,第一個彈窗不會再返回锦爵。
后面即可重復(fù)執(zhí)行此類彈窗彈出邏輯舱殿。彈窗類型中可能會包含倒計時自動關(guān)閉等,可在倒計時結(jié)束時自動調(diào)用finish险掀,然后按順序彈出第二個彈窗沪袭。
UI層面可根據(jù)業(yè)務(wù)需求封裝兩到三類通用型彈窗,可改變文案迷郑、圖片枝恋、是否自動關(guān)閉的相關(guān)屬性。
重點說明升級彈窗嗡害,如果是配置了強更焚碌,那升級彈窗即無法關(guān)閉,始終常駐霸妹,除非點擊了彈窗十电,會跳轉(zhuǎn)至市場進行升級,升級之后app會重新啟動叹螟,判斷版本已經(jīng)是最新后鹃骂,升級彈窗則不再彈出。
使用單例創(chuàng)建一個彈窗主體管理器罢绽,在管理器內(nèi)部添加上述邏輯畏线。
管理器h文件:
@interface WindowPopManager : NSObject
+ (WindowPopManager*)shared;
-(void)showWindowPopWithPopArray:(NSMutableArray *)popArray;
@property (nonatomic, assign) BOOL popWindowIsShowing;//當(dāng)前彈窗是否正在展示
@property (nonatomic, strong) UIView *currentWindowPopView;//當(dāng)前正在展示額彈窗view
@end
管理器m文件:
單例創(chuàng)建管理器:
+ (WindowPopManager*)shared{
? ? static dispatch_once_t once;
? ? static WindowPopManager *shared;
? ? dispatch_once(&once, ^ {
? ? ? ? shared = [[WindowPopManageralloc]init];
? ? });
? ? returnshared;
}
調(diào)用彈出方法(此處以升級升級彈窗為例):
-(void)showWindowPopWithPopArray:(NSMutableArray *)popArray{
? ? if(self.popWindowIsShowing){
? ? ? ? return;
? ? }
? ? self.popArray= popArray;
? ? if(self.popArray.count){
? ? ? ? self.popWindowIsShowing = YES;
? ? ? ? NSDictionary*dict =self.popArray[0];
? ? ? ? NSString*type = dict[@"type"];
? ? ? ? if([typeisEqualToString:@"appupgrade"]){
? ? ? ? ? ? //===========================升級彈窗===========================
? ? ? ? ? ? self.updataView.descTextView.text= [NSStringstringWithFormat:@"%@", dict[@"data"][@"description"]];
? ? ? ? ? ? if([dict[@"data"][@"forceUpdate"]intValue] ==1) {
? ? ? ? ? ? ? ? self.updataView.closeButton.hidden=YES;
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? self.updataView.closeButton.hidden=NO;
? ? ? ? ? ? }
? ? ? ? ? ? [KEY_WINDOWaddSubview:self.updataView];
? ? ? ? ? ? self.currentWindowPopView = self.updataView;
? ? ? ? }
}
彈窗finish方法(注:強更升級彈窗不調(diào)用該方法):
#pragma mark- 標(biāo)記消除彈框
-(void)windowFinishWithView:(UIView *)view{
? ? self.currentWindowPopView = nil;
? ? self.popWindowIsShowing = NO;
? ? if(self.popArray.count){
? ? ? ? NSDictionary*dict =self.popArray[0];
? ? ? ? [BTHTTPRequest windowFinishWithType:dict[@"type"] popId:dict[@"id"] Success:^(id? _Nonnull response) {
? ? ? ? ? ? if([response[@"code"]integerValue] ==200){
? ? ? ? ? ? }else{
? ? ? ? ? ? }
? ? ? ? }BTFail:^(NSError*_Nonnullerror) {
? ? ? ? }];
? ? }
}
最后:只是提供一個彈窗管理調(diào)度思路和大概的參考,因各類APP的業(yè)務(wù)繁雜良价,無法進行完整的封裝寝殴,希望對你有幫助蒿叠。