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
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
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
Thumbnail
# 簡介 身為一位專注於 Vue.js 的前端開發者,這是我第一次嘗試構建 Flutter 網頁應用。讓我們開始吧! ## 第一次嘗試 ### 第一步:創建一個 Flutter 應用 首先,通過運行以下命令來創建一個新的 Flutter 項目: ```sh flutter
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
本篇文章將分享手機App設計教學,並往後介紹使用Flutter開發App的相關知識和技巧。透過這系列的分享,讀者將能夠學習如何利用設計和程式開發技能來製作一個App。文章中也提供了一些靈感來源和教學資源,幫助讀者進行設計和開發的思考和學習。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在APP中打開外部瀏覽器是一個常見的需求,特別是當你需要在APP中顯示外部網頁或處理特定的網絡操作時。本文介紹了三種常見的方法來解決內部瀏覽器操作問題並在APP中打開外部瀏覽器:使用系統預設瀏覽器、使用WebView控件和使用自定義瀏覽器控件。
Thumbnail
#底層邏輯 #百萬網紅也是這樣教 單純製作短視頻的順序~(簡要版) . #規劃與觀察 第一、選擇賽道、觀察對手先開帳號去跟有興趣的帳號互動,了解不同平台熱門的賽道,進而選擇適合自己的賽道找出競品差異,建立精準的人設。 . #決心很重要 第二、準備設備和決心其實穩定器、指向麥克風、手機幾乎就是全部的
Thumbnail
以​文字​建立​影像,有很多功能如下: 完成提示詞之後,選擇功能設定 1.模型版本:內有兩個模型 Image1屬於照片和插圖風格,Image2擬真人版風格,我還是喜歡Image2風格比較好看。 2.比例:3:4或4:3或1:1或16:9,這個有別於目前AI生圖都是1:1版型,這可以依據您想要使
之前使用發佈預排功能,試了幾次,文章並未顯示於沙龍, 此篇為再測試使用,無法事先預排真的不太方便
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
Thumbnail
# 簡介 身為一位專注於 Vue.js 的前端開發者,這是我第一次嘗試構建 Flutter 網頁應用。讓我們開始吧! ## 第一次嘗試 ### 第一步:創建一個 Flutter 應用 首先,通過運行以下命令來創建一個新的 Flutter 項目: ```sh flutter
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
本篇文章將分享手機App設計教學,並往後介紹使用Flutter開發App的相關知識和技巧。透過這系列的分享,讀者將能夠學習如何利用設計和程式開發技能來製作一個App。文章中也提供了一些靈感來源和教學資源,幫助讀者進行設計和開發的思考和學習。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在APP中打開外部瀏覽器是一個常見的需求,特別是當你需要在APP中顯示外部網頁或處理特定的網絡操作時。本文介紹了三種常見的方法來解決內部瀏覽器操作問題並在APP中打開外部瀏覽器:使用系統預設瀏覽器、使用WebView控件和使用自定義瀏覽器控件。
Thumbnail
#底層邏輯 #百萬網紅也是這樣教 單純製作短視頻的順序~(簡要版) . #規劃與觀察 第一、選擇賽道、觀察對手先開帳號去跟有興趣的帳號互動,了解不同平台熱門的賽道,進而選擇適合自己的賽道找出競品差異,建立精準的人設。 . #決心很重要 第二、準備設備和決心其實穩定器、指向麥克風、手機幾乎就是全部的
Thumbnail
以​文字​建立​影像,有很多功能如下: 完成提示詞之後,選擇功能設定 1.模型版本:內有兩個模型 Image1屬於照片和插圖風格,Image2擬真人版風格,我還是喜歡Image2風格比較好看。 2.比例:3:4或4:3或1:1或16:9,這個有別於目前AI生圖都是1:1版型,這可以依據您想要使
之前使用發佈預排功能,試了幾次,文章並未顯示於沙龍, 此篇為再測試使用,無法事先預排真的不太方便