一次有意思的技術降級,iOS 啟動廣告,直接 push,首頁不出現

鄧輕舟發表於2018-11-18

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

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 的框架(首頁)載入出來,進入業務層的世界。

大方:

大方

看了一下喜馬拉雅的效果,也覺得挺好的。

華新鎮的風味.

相關程式碼: dev.tencent.com/u/dengjiang…

其他技術點:

可以網路請求非同步發起,下次使用,AFNetworking 的事情。

圖片快取策略,SDWebImage 的事情。

倒數計時功能, timer 。 廣告介面的圖片上, 加手勢跳轉。

未實現的思路:

(設想過,延長系統的啟動時間,開一條新的執行緒出來,進行網路請求,在其回撥中通知主執行緒繼續 。NaN )

iOS 啟動廣告頁思路,直接 push,首頁不出現,上海華新鎮風味

不好意思,以後恢復

github.com/BoxDengJZ/s…

相關文章