App啟動時,利用firebase remoteConfig來決定初始畫面

閱讀時間約 9 分鐘

最近碰到個神奇的需求,App啟動時,才要用firebase remoteConfig去決定初始畫面

Q: 但一開始沒畫面要怎麼辦?_?

A: 做一個假啟動畫面給他

一般的啟動流程

App啟動 ➜ Launch Screen ➜ didFinishLaunching開始 ➜ 設定rootViewController ➜ didFinishLaunching結束

Launch Screen是 App 啟動時,向使用者展示的第一個畫面。顯示的時間長短是系統控制的,開發者無法控制。也沒辦法在上面打API做一些有的沒的。

所以我們要做的是在didFinishLaunching先去設一個跟launch Screen一模一樣的畫面,到這個假啟動畫面上去拿remoteConfig,讓使用者感覺我們還在啟動中。等到去firebase上拿完value,再跳轉過去。

raw-image
  1. AppDelegate裡先設定假的啟動畫面當rootViewController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
// ...
// 設定RootViewController
    FakeSplashViewController * splashVC = [[FakeSplashViewController alloc] init];

    [self.window setRootViewController: splashVC];
// ...

[self.window makeKeyAndVisible];

    return YES;

}
  1. 再到假啟動畫面的viewDidAppear裡,去firebase上拿值

注意:不要寫在viewDidLoad裡,有可能啟動還沒完成就去換root導致crash!!

class FakeSplashViewController: UIViewController { 

   override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {

        super.viewDidAppear(animated)

        // 延遲換rootViewController,確保整個啟動流程已執行完畢

        self.setRootViewController()

    }

}
  1. 置換rootViewController
func setRootViewController() {
let version = RemoteConfigHelper.shared.fetchStringValue(key: RemoteConfigKey.version.rawValue)
    if version == "1" {
        let tabVC = V1TabBarController()
        appDelegate.window.rootViewController = tabVC
        Router.shared.setRootController(rootController: tabVC)
} else {
        let tabVC = V2TabBarController()
        appDelegate.window.rootViewController = tabVC
        Router.shared.setRootController(rootController: tabVC)
    }

}

推播的情況

上面的方案感覺完美,但是有一種情境是在App未啟動的情況下,點擊推播開啟指定頁面,這時候因為App還未設定好你要的rootViewController,造成跳轉無效。

例如:rootViewController應該要是UINavigationController,點擊推播用push跳轉頁面。但是在未完成拿到firebase的情況下,root還是假的啟動頁面,造成跳轉無效。

所以我們要確定rootViewController已設成我們要的,再做跳轉行為。

1.AppDelegate收到通知

#pragma mark - UNUserNotificationCenterDelegate

//在背景收到通知

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler {
    NSDictionary *userInfo = response.notification.request.content.userInfo;
    [[PushNotificationManager shared] receiveWithUserInfo: userInfo];
}
  1. 在PushNotificationManager設定推播跳轉頁面,如果isRootComplete還沒完成,就先把Action存起來。
@objcMembers class PushNotificationManager: NSObject {
    static let shared = PushNotificationManager()
    var pendingAction: ActionData?
    struct ActionData {
        var dict: [String: String]?
    }
    private override init() {}
    func receive(userInfo: [String: Any]?) {
        Task { @MainActor in
            await receiveRemoteNotification(userInfo: userInfo)
        }
    }
    private func receiveRemoteNotification(userInfo: [String: Any]?) async {
       // …拿一些必要參數
       if LoginManager.shared.isRootComplete {
// root已經完成,直接跳轉
let vc = MyViewController(dict: dict)
            Router.shared.push(vc)
       } else {
// root設置還沒完成,先存起來
    pendingAction = ActionData(dict: dict)
        }
    }

    @MainActor
    func processPendingTransferAction() {
      guard let action = pendingAction else {
           return
      }
      receiveRemoteNotification(userInfo: pendingAction.dict)
// 做完記得清掉​
      pendingAction = nil
    }
}
  1. 回到假啟動畫面FakeSplashViewController,如果已從firebase拿完,把isCompleteRoot設成true,並執行還未進行的Action。
class FakeSplashViewController: UIViewController { 
// ...
func setRootViewController() {
// ...拿完firebase remoteConfig
   LoginManager.shared.isCompleteRoot = true
    PushNotificationManager.shared.processPendingTransferAction()
}
}






5會員
30內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
發表第一個留言支持創作者!
Michelle Chen的沙龍 的其他內容
iOS App 圖片檔案快取機制
閱讀時間約 3 分鐘
客製化長相的UITabBarController
閱讀時間約 9 分鐘
MVC v.s. MVVM 學習筆記
閱讀時間約 3 分鐘
iOS常用的Design Pattern
閱讀時間約 10 分鐘
iOS開發:選取&顯示GIF的方法
閱讀時間約 8 分鐘
你可能也想看
「無邊記」啟發靈感、激發共創精神的強大App在iOS 16.2的更新中,蘋果推出全新的「無邊記」應用程式,用於記錄靈感、筆記、繪圖,其中一項引人注目的特色是無限延展的虛擬白板,還允許多位使用者一同參與創作,進行集思廣益和腦力激盪。
Thumbnail
avatar
原來可以這樣做
2023-11-17
Yo-Kai Express與GoSky全球合作!透過Instagram小程序在美、日等150多店點啟動免下載會員Mini App,瞬間發放優惠券,打造前所未有的便捷消費體驗! 文、圖/GoSky AI 提供   在全球消費市場,「便利」已不再只是一個口號,而是每一位消費者真正渴求的體驗。Yo-Kai Express與GoSky兩家新創確實捕捉到這一趨勢,並已跨足全球,攜手合作,為消費者提供極致便捷的服務體驗。    Yo-Kai Express,以其創新業
Thumbnail
avatar
廣告雜誌
2023-08-18
股票出借懶人包 ( 1 ):雙向借券 App 操作|帶媽媽看診順便把掛號費賺起來股票出借懶人包 ( 1 ):雙向借券 App 操作|帶媽媽看診順便把掛號費賺起來
Thumbnail
avatar
承熙
2023-05-18
四月第三周至五月第一周(至05/07)更新進度報告~ALL超爆笑詐騙APP,推薦起「圓夢假」欣興~猜猜是不是虎父無犬子?程式界「萬年名言」:Garbage Input, Garbage output. 從北極星、智擎以來,百發百不中,連先射箭、再畫箭靶、居然還射中隔壁老王靶心的「All宗教大師」…4/30爆笑發文快去看,很快就會偷偷砍了。 說過再挑釁、找碴、煽動,本蛙嘴巴大、舌頭長,還全身都有毒,一定加倍報復……
Thumbnail
avatar
井底之蛙
2023-05-02
馬斯克收購推特,企圖打造超級App「X」?一波三折的推特(twitter)收購案,有科技狂人之稱的全球首富馬斯克(Elon Musk)最終同意以大約440億美元買下推特,計畫未來將打造全新App「X」。馬斯克表示希望將推特打造成像中國微信一樣的超級應用程式,但外界對此並不看好。個人比較持樂見其成的態度,畢竟馬斯克是我心目中的超級產品經理之一
Thumbnail
avatar
Vincent
2022-10-18
無頭式電商 ?從「頭」說起 — Line、APP、到新通路:擁抱變化,回歸本質。什麼是無頭式電商(Headless Commerce)?這是因應新通路的快速出現,而發展出來的零售系統概念:用API為基礎,作為一套零售中台或是零售核心作業系統,主控零售的核心:商品、交易、會員、數據,作為彈性發展各種通路應用的根本。
Thumbnail
avatar
Happy Lee 黑皮李
2021-11-09
一綺成長:免費讀好書,電子書app體驗後心得(HyRread、樂隨讀我myBook)電子書由於有隨身攜帶、隨買隨看、一鍵購書等優點,有些書城app的功能還可以在書上做個人註記、加入書籤、關鍵字搜索等功能。 在現今數位資訊的時代,能夠滿足人們對於時間安排、知識獲取的需求,且搭配的查找功能更可以在關鍵時刻快速找到需要的內容,此外當然還有包括環保、節省紙張、省書櫃空間等
Thumbnail
avatar
一綺
2021-05-04
記 android app 開啟錯誤 這次錯誤在Android 11 發生 去年12月底 , 有客戶反應 , 在 android 11 的手機 , 公司 app 開不起來 或開起來跑很久 , 空白頁..........登入畫面空白 之類奇怪的問題 一開始用 Android studio 的模擬器試 , 沒問題 看來需要實機了 於是就開始
Thumbnail
avatar
proof.K
2021-03-26
移除 Windows 10 內建/預載的Office app,解決已安裝正版Office卻一直要求啟用的狀況。此文章資訊目前先轉載其他地方提供的連結教學 https://csd.ntpu.edu.tw/content_nf.aspx?t=qa&i=20191106144123363 http://webc2.must.edu.tw/jtmust001/index.php/home/2017-01-12-11
avatar
郭蓋特
2020-11-26