有趣的 iOS 啓動廣告頁,直接 push,首頁不出現

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 了.

launch_delete_main

缺點:
-
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 )

相關文章
相關標籤/搜索