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()
}
}






留言
avatar-img
留言分享你的想法!
avatar-img
Michelle Chen的沙龍
8會員
34內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
Michelle Chen的沙龍的其他內容
2024/09/06
本文介紹了使用KeyboardLayoutGuide的方法,以及在不同iOS版本和設備上遇到的佈局問題。透過調整TextView的底部對齊方式,成功解決了在模擬器和真實設備上出現的錯誤,提供了有用的建議給開發者。本文還探討了為何在iOS15與Xib的組合使用中會出現問題,以及解決方案。
Thumbnail
2024/09/06
本文介紹了使用KeyboardLayoutGuide的方法,以及在不同iOS版本和設備上遇到的佈局問題。透過調整TextView的底部對齊方式,成功解決了在模擬器和真實設備上出現的錯誤,提供了有用的建議給開發者。本文還探討了為何在iOS15與Xib的組合使用中會出現問題,以及解決方案。
Thumbnail
2024/08/07
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
2024/08/07
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
2024/07/03
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
2024/07/03
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
看更多
你可能也想看
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
Thumbnail
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
Thumbnail
# 簡介 身為一位專注於 Vue.js 的前端開發者,這是我第一次嘗試構建 Flutter 網頁應用。讓我們開始吧! ## 第一次嘗試 ### 第一步:創建一個 Flutter 應用 首先,通過運行以下命令來創建一個新的 Flutter 項目: ```sh flutter
Thumbnail
# 簡介 身為一位專注於 Vue.js 的前端開發者,這是我第一次嘗試構建 Flutter 網頁應用。讓我們開始吧! ## 第一次嘗試 ### 第一步:創建一個 Flutter 應用 首先,通過運行以下命令來創建一個新的 Flutter 項目: ```sh flutter
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
本篇文章將分享手機App設計教學,並往後介紹使用Flutter開發App的相關知識和技巧。透過這系列的分享,讀者將能夠學習如何利用設計和程式開發技能來製作一個App。文章中也提供了一些靈感來源和教學資源,幫助讀者進行設計和開發的思考和學習。
Thumbnail
本篇文章將分享手機App設計教學,並往後介紹使用Flutter開發App的相關知識和技巧。透過這系列的分享,讀者將能夠學習如何利用設計和程式開發技能來製作一個App。文章中也提供了一些靈感來源和教學資源,幫助讀者進行設計和開發的思考和學習。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在APP中打開外部瀏覽器是一個常見的需求,特別是當你需要在APP中顯示外部網頁或處理特定的網絡操作時。本文介紹了三種常見的方法來解決內部瀏覽器操作問題並在APP中打開外部瀏覽器:使用系統預設瀏覽器、使用WebView控件和使用自定義瀏覽器控件。
Thumbnail
在APP中打開外部瀏覽器是一個常見的需求,特別是當你需要在APP中顯示外部網頁或處理特定的網絡操作時。本文介紹了三種常見的方法來解決內部瀏覽器操作問題並在APP中打開外部瀏覽器:使用系統預設瀏覽器、使用WebView控件和使用自定義瀏覽器控件。
Thumbnail
#底層邏輯 #百萬網紅也是這樣教 單純製作短視頻的順序~(簡要版) . #規劃與觀察 第一、選擇賽道、觀察對手先開帳號去跟有興趣的帳號互動,了解不同平台熱門的賽道,進而選擇適合自己的賽道找出競品差異,建立精準的人設。 . #決心很重要 第二、準備設備和決心其實穩定器、指向麥克風、手機幾乎就是全部的
Thumbnail
#底層邏輯 #百萬網紅也是這樣教 單純製作短視頻的順序~(簡要版) . #規劃與觀察 第一、選擇賽道、觀察對手先開帳號去跟有興趣的帳號互動,了解不同平台熱門的賽道,進而選擇適合自己的賽道找出競品差異,建立精準的人設。 . #決心很重要 第二、準備設備和決心其實穩定器、指向麥克風、手機幾乎就是全部的
Thumbnail
以​文字​建立​影像,有很多功能如下: 完成提示詞之後,選擇功能設定 1.模型版本:內有兩個模型 Image1屬於照片和插圖風格,Image2擬真人版風格,我還是喜歡Image2風格比較好看。 2.比例:3:4或4:3或1:1或16:9,這個有別於目前AI生圖都是1:1版型,這可以依據您想要使
Thumbnail
以​文字​建立​影像,有很多功能如下: 完成提示詞之後,選擇功能設定 1.模型版本:內有兩個模型 Image1屬於照片和插圖風格,Image2擬真人版風格,我還是喜歡Image2風格比較好看。 2.比例:3:4或4:3或1:1或16:9,這個有別於目前AI生圖都是1:1版型,這可以依據您想要使
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News