PM 提了個需求,啓動廣告界面點擊了, 就直接進,不須要閃一下主界面。git
實現的思路,多 window 模式
-github
通常的廣告界面就是 Key Window 上面的遮罩(子視圖)。緩存
要從廣告界面 push,天然廣告界面是一個控制器了。
提高廣告界面的層級,才能夠。網絡
這裏提高爲 window 。而後就是切換展現的窗口了,經過系統單例 AppDelegate , [delegate.window makeKeyAndVisible];
app
若是使用的是控制器, 單 window (就是系統默認建立的), 切換就是 [UIApplication sharedApplication].keyWindow.rootViewController = ...
框架
兩點考慮:異步
1, 但願啓動的時候首頁早加載,就必須給首頁一個 window 容器。動畫
若是使用的是控制器, 從廣告到首頁,切換即從新建立。atom
2,能夠在內存上覆用。首頁轉登陸,登陸再轉首頁spa
以前項目用的是切換 keyWindow 的 rootViewController, 而後首頁就丟了,拿不到。登陸邏輯中,新建一個,以爲有點惋惜。
使用多 window , 經過系統單例 (AppDelegate *)UIApplication.sharedApplication.delegate
, 拿回首頁,能夠在內存上覆用。
- (void)backToWindow{ AppDelegate * delegate = (AppDelegate *)UIApplication.sharedApplication.delegate; [delegate.window makeKeyAndVisible]; }
項目中採用了三個 window, 一個主流程,一個廣告, 一個登陸,
KeyAndVisible 的是廣告 window.
怎麼辦?
由於要等一個網絡請求(網絡請求廣告接口),失敗了,就進主界面。 成功了,接着請求圖片(使用了兩級緩存)
延長啓動時間的時候,不能影響體驗,不能被系統的 daemon 幹掉。
就要用 trick 了。
根控制器是廣告控制器。
self.adWindow.rootViewController = [[UINavigationController alloc] initWithRootViewController: [[AdvertiseViewController alloc] init]];
廣告控制器的背景圖,來一個佔位圖,就是啓動圖。
( 項目緣由,廣告都是實時請求。不是市面上的異步緩存,下次使用。 華新鎮風味)
@interface AppDelegate // 主流程 @property (strong, nonatomic) UIWindow *window; // 廣告 @property (strong, nonatomic) UIWindow *adWindow; // 登陸 @property (strong, nonatomic) UIWindow *loginWindow;
@implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] init]; self.window.frame = [UIScreen mainScreen].bounds; FrontTabBarController * tabBarController = [[FrontTabBarController alloc] init]; tabBarController.view.backgroundColor = UIColor.redColor; self.window.rootViewController = tabBarController; self.adWindow = [[UIWindow alloc] init]; self.adWindow.frame = [UIScreen mainScreen].bounds; self.adWindow.rootViewController = [[UINavigationController alloc] initWithRootViewController: [[AdvertiseViewController alloc] init]];; [self.adWindow makeKeyAndVisible]; return YES; }
須要在 Target 的 General 選項卡中, 指定 Main Interface 爲空。
建議刪除 main.storyboard.
由於啓動的時候切換 window, 就不能走 main.storyboard 了.
缺點:
-
1, 沒有轉場動畫 transition。 退出廣告界面,刷的一下出現了主界面,沒有 pop.
2, 內存管理, 由於用戶看到的 window 只有一個。
廣告業務處理完後,切換回首頁 window, 就應該釋放廣告 window.
( 廣告 window 是 appDelegate 的屬性,appDelegate 是單例, 因此 appDelegate 的廣告 window 屬性,初始化後,會一直都存在)
在這個時機寫, appDelegate.adWindow = nil
, 就會黑光一閃。
這確定是不行的。
須要在以後找地方釋放,代碼會亂一些。
iOS 啓動廣告界面,通常是在 window 上添加子視圖。
UIWindow *window = [UIApplication sharedApplication].delegate.window; [window addSubview: self];
廣告界面就是首頁 rootViewController ( 或者其子 Controller )上面的遮罩。點擊廣告頁,通常是通知首頁的 topViewController push 出廣告的內容控制器。
搜到的 App 啓動加載廣告頁面思路都這麼寫。 這篇不錯。
這種思路挺好的,通常的廣告界面的 link 是 deep link, 與 app 強交互,先把整個 app 的框架(首頁)加載出來,進入業務層的世界。
大方:
看了一下喜馬拉雅的效果,也以爲挺好的。
華新鎮的風味.
相關代碼: https://github.com/BoxDengJZ/...
-
能夠網絡請求異步發起,下次使用,AFNetworking 的事情。
圖片緩存策略,SDWebImage 的事情。
倒計時功能, timer 。 廣告界面的圖片上, 加手勢跳轉。
(設想過,延長系統的啓動時間,開一條新的線程出來,進行網絡請求,在其回調中通知主線程繼續 。NaN )