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

更新於 2024/04/29閱讀時間約 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()
}
}






avatar-img
7會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Michelle Chen的沙龍 的其他內容
這篇文章主要討論了在 iOS 開發中,使用 UIImagePickerController 來選取 GIF 圖片時會變成靜態截圖的問題,並推薦了使用新的 PHPickerViewController 選取 GIF 檔案。同時提供了一些處理 GIF 圖片的方法。
這篇文章介紹了 iOS 中常用的 Design Patterns,包括 MVC、MVVM、Singleton、Delegation、Observer 等。同時比較了 Delegate 和 Notification 的使用時機。參考資料中還有更多相關資訊。
本文紀錄了MVC和MVVM的差異,包括各自的優缺點和最大差異,並討論了MVVM的商業邏輯應該寫在哪的問題。
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個
Sandbox 架構 /Documents:主要用於儲存用戶生成的數據或者不能重新創建的數據。這些可能包括由你的應用程式創建的文件、從服務器下載的文件、用戶在應用程式中創建或修改的數據等。 這些數據在應用程式的生命週期中是持久保存的,即使應用程式被終止或者系統重啟,這些數據也會保留。此外
這篇文章主要討論了在 iOS 開發中,使用 UIImagePickerController 來選取 GIF 圖片時會變成靜態截圖的問題,並推薦了使用新的 PHPickerViewController 選取 GIF 檔案。同時提供了一些處理 GIF 圖片的方法。
這篇文章介紹了 iOS 中常用的 Design Patterns,包括 MVC、MVVM、Singleton、Delegation、Observer 等。同時比較了 Delegate 和 Notification 的使用時機。參考資料中還有更多相關資訊。
本文紀錄了MVC和MVVM的差異,包括各自的優缺點和最大差異,並討論了MVVM的商業邏輯應該寫在哪的問題。
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個
Sandbox 架構 /Documents:主要用於儲存用戶生成的數據或者不能重新創建的數據。這些可能包括由你的應用程式創建的文件、從服務器下載的文件、用戶在應用程式中創建或修改的數據等。 這些數據在應用程式的生命週期中是持久保存的,即使應用程式被終止或者系統重啟,這些數據也會保留。此外
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在iOS 16.2的更新中,蘋果推出全新的「無邊記」應用程式,用於記錄靈感、筆記、繪圖,其中一項引人注目的特色是無限延展的虛擬白板,還允許多位使用者一同參與創作,進行集思廣益和腦力激盪。
Thumbnail
文、圖/GoSky AI 提供   在全球消費市場,「便利」已不再只是一個口號,而是每一位消費者真正渴求的體驗。Yo-Kai Express與GoSky兩家新創確實捕捉到這一趨勢,並已跨足全球,攜手合作,為消費者提供極致便捷的服務體驗。    Yo-Kai Express,以其創新業
Thumbnail
程式界「萬年名言」:Garbage Input, Garbage output. 從北極星、智擎以來,百發百不中,連先射箭、再畫箭靶、居然還射中隔壁老王靶心的「All宗教大師」…4/30爆笑發文快去看,很快就會偷偷砍了。 說過再挑釁、找碴、煽動,本蛙嘴巴大、舌頭長,還全身都有毒,一定加倍報復……
Thumbnail
一波三折的推特(twitter)收購案,有科技狂人之稱的全球首富馬斯克(Elon Musk)最終同意以大約440億美元買下推特,計畫未來將打造全新App「X」。馬斯克表示希望將推特打造成像中國微信一樣的超級應用程式,但外界對此並不看好。個人比較持樂見其成的態度,畢竟馬斯克是我心目中的超級產品經理之一
Thumbnail
什麼是無頭式電商(Headless Commerce)?這是因應新通路的快速出現,而發展出來的零售系統概念:用API為基礎,作為一套零售中台或是零售核心作業系統,主控零售的核心:商品、交易、會員、數據,作為彈性發展各種通路應用的根本。
Thumbnail
電子書由於有隨身攜帶、隨買隨看、一鍵購書等優點,有些書城app的功能還可以在書上做個人註記、加入書籤、關鍵字搜索等功能。 在現今數位資訊的時代,能夠滿足人們對於時間安排、知識獲取的需求,且搭配的查找功能更可以在關鍵時刻快速找到需要的內容,此外當然還有包括環保、節省紙張、省書櫃空間等
Thumbnail
這次錯誤在Android 11 發生 去年12月底 , 有客戶反應 , 在 android 11 的手機 , 公司 app 開不起來 或開起來跑很久 , 空白頁..........登入畫面空白 之類奇怪的問題 一開始用 Android studio 的模擬器試 , 沒問題 看來需要實機了 於是就開始
此文章資訊目前先轉載其他地方提供的連結教學 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
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在iOS 16.2的更新中,蘋果推出全新的「無邊記」應用程式,用於記錄靈感、筆記、繪圖,其中一項引人注目的特色是無限延展的虛擬白板,還允許多位使用者一同參與創作,進行集思廣益和腦力激盪。
Thumbnail
文、圖/GoSky AI 提供   在全球消費市場,「便利」已不再只是一個口號,而是每一位消費者真正渴求的體驗。Yo-Kai Express與GoSky兩家新創確實捕捉到這一趨勢,並已跨足全球,攜手合作,為消費者提供極致便捷的服務體驗。    Yo-Kai Express,以其創新業
Thumbnail
程式界「萬年名言」:Garbage Input, Garbage output. 從北極星、智擎以來,百發百不中,連先射箭、再畫箭靶、居然還射中隔壁老王靶心的「All宗教大師」…4/30爆笑發文快去看,很快就會偷偷砍了。 說過再挑釁、找碴、煽動,本蛙嘴巴大、舌頭長,還全身都有毒,一定加倍報復……
Thumbnail
一波三折的推特(twitter)收購案,有科技狂人之稱的全球首富馬斯克(Elon Musk)最終同意以大約440億美元買下推特,計畫未來將打造全新App「X」。馬斯克表示希望將推特打造成像中國微信一樣的超級應用程式,但外界對此並不看好。個人比較持樂見其成的態度,畢竟馬斯克是我心目中的超級產品經理之一
Thumbnail
什麼是無頭式電商(Headless Commerce)?這是因應新通路的快速出現,而發展出來的零售系統概念:用API為基礎,作為一套零售中台或是零售核心作業系統,主控零售的核心:商品、交易、會員、數據,作為彈性發展各種通路應用的根本。
Thumbnail
電子書由於有隨身攜帶、隨買隨看、一鍵購書等優點,有些書城app的功能還可以在書上做個人註記、加入書籤、關鍵字搜索等功能。 在現今數位資訊的時代,能夠滿足人們對於時間安排、知識獲取的需求,且搭配的查找功能更可以在關鍵時刻快速找到需要的內容,此外當然還有包括環保、節省紙張、省書櫃空間等
Thumbnail
這次錯誤在Android 11 發生 去年12月底 , 有客戶反應 , 在 android 11 的手機 , 公司 app 開不起來 或開起來跑很久 , 空白頁..........登入畫面空白 之類奇怪的問題 一開始用 Android studio 的模擬器試 , 沒問題 看來需要實機了 於是就開始
此文章資訊目前先轉載其他地方提供的連結教學 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