PM 提了個需求,啟動廣告介面點選了, 就直接進,不需要閃一下主介面。
要這種:
實現的思路,多 window 模式
一般的廣告介面就是 Key Window 上面的遮罩(子檢視)。
要從廣告介面 push,自然廣告介面是一個控制器了。 提升廣告介面的層級,才可以。
這裡提升為 window 。然後就是切換展示的視窗了,通過系統單例 AppDelegate , [delegate.window makeKeyAndVisible];
如果使用的是控制器, 單 window (就是系統預設建立的), 切換就是 [UIApplication sharedApplication].keyWindow.rootViewController = ...
兩點考慮:
1, 希望啟動的時候首頁早載入,就必須給首頁一個 window 容器。
如果使用的是控制器, 從廣告到首頁,切換即重新建立。
2,可以在記憶體上覆用。首頁轉登入,登入再轉首頁
之前專案用的是切換 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 的框架(首頁)載入出來,進入業務層的世界。
大方:
看了一下喜馬拉雅的效果,也覺得挺好的。
華新鎮的風味.
相關程式碼: dev.tencent.com/u/dengjiang…
其他技術點:
可以網路請求非同步發起,下次使用,AFNetworking 的事情。
圖片快取策略,SDWebImage 的事情。
倒數計時功能, timer 。 廣告介面的圖片上, 加手勢跳轉。
未實現的思路:
(設想過,延長系統的啟動時間,開一條新的執行緒出來,進行網路請求,在其回撥中通知主執行緒繼續 。NaN )
iOS 啟動廣告頁思路,直接 push,首頁不出現,上海華新鎮風味
不好意思,以後恢復