PM 提了個需求,啓動廣告界面點擊了, 就直接進,不須要閃一下主界面。git
通常的廣告界面就是 Key Window 上面的遮罩(子視圖)。github
要從廣告界面 push,天然廣告界面是一個控制器了。 提高廣告界面的層級,才能夠。緩存
這裏提高爲 window 。而後就是切換展現的窗口了,經過系統單例 AppDelegate , [delegate.window makeKeyAndVisible];
bash
若是使用的是控制器, 單 window (就是系統默認建立的), 切換就是 [UIApplication sharedApplication].keyWindow.rootViewController = ...
網絡
兩點考慮:app
1, 但願啓動的時候首頁早加載,就必須給首頁一個 window 容器。框架
若是使用的是控制器, 從廣告到首頁,切換即從新建立。異步
2,能夠在內存上覆用。首頁轉登陸,登陸再轉首頁動畫
以前項目用的是切換 keyWindow 的 rootViewController, 而後首頁就丟了,拿不到。登陸邏輯中,新建一個,以爲有點惋惜。 使用多 window , 經過系統單例 (AppDelegate *)UIApplication.sharedApplication.delegate
, 拿回首頁,能夠在內存上覆用。ui
- (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 的框架(首頁)加載出來,進入業務層的世界。
大方:
看了一下喜馬拉雅的效果,也以爲挺好的。
華新鎮的風味.
能夠網絡請求異步發起,下次使用,AFNetworking 的事情。
圖片緩存策略,SDWebImage 的事情。
倒計時功能, timer 。 廣告界面的圖片上, 加手勢跳轉。
(設想過,延長系統的啓動時間,開一條新的線程出來,進行網絡請求,在其回調中通知主線程繼續 。NaN )
很差意思,之後恢復