iOS上的實時遠程配置

當您須要快速推出遠程配置更改時該怎麼辦?也許你作的上次更改沒有成功,你想盡快撤消它們。或者您的應用中出現了問題,您須要禁用整個功能。ios

更頻繁地調用fetchWithExpirationDuration:completionHandler:(具備較少的到期時間)是一種方法,但Firebase不鼓勵這樣作。你冒着被下架的風險。npm

若是您須要使遠程配置緩存無效,而沒必要對短暫的到期時間進行硬編碼,該怎麼辦?而不是反覆詢問服務器更新,讓服務器在有更改時通知您。 Firebase遠程配置如今與雲功能集成,所以能夠在配置發佈或回滾時觸發執行。這意味着您可讓一個函數向您的應用發送靜默推送通知,讓它知道配置已更改。 api

實時遠程配置更新是使用推送通知使遠程配置緩存無效
在在AppDelegate中觸發回調時,不會向用戶顯示靜默推送通知。經過將選項content_available設置爲true,您甚至能夠在推送通知到達時讓iOS在後臺啓動您的應用程序(或恢復它)。一個問題:若是用戶手動殺死它,iOS將沒法在後臺啓動您的應用程序。這將持續到下次從新啓動(第一次解鎖後)。除此以外,你沒有其餘問題了。

實現

這個過程歸結爲:緩存

  1. 將應用程序訂閱到Firebase Cloud Messaging主題
  2. 建立在遠程配置更改時觸發的雲功能
  3. 處理AppDelegate中的靜音推送通知
  4. 在下次啓動時使遠程配置緩存無效

如何設置Firebase雲消息傳遞超出了本文的範圍,但文檔是一個很好的起點。bash

1.訂閱到主題

推送通知啓動並運行後,咱們須要將應用訂閱到主題。咱們將專門用於遠程配置。服務器

Messaging.messaging().subscribe(toTopic: "REMOTE_CONFIG") { error in
    if let error = error {
        debugPrint("Could not subscribe to Remote Config topic", error)
    }
}
複製代碼

2.建立一個雲服務

Cloud Function只是一個Node.js腳本,所以您須要在您的計算機上使用Node.js.在撰寫本文時,Cloud Functions支持Node v6或Node v8,其中v6是默認值。微信

得到Node.js後,首先安裝Firebase CLI併發

npm install -g firebase-toolsapp

而後使用CLI工具進行身份驗證。函數

firebase login

如今爲函數建立一個文件夾,cd進入它並初始化Firebase項目。

firebase init functions

這將啓動CLI嚮導。完成它,你就準備好了。

是時候添加將向 REMOTE_CONFIG通道發送靜默推送通知的雲功能。在新建立的項目的函數目錄中,您將找到 index.js。打開它並用如下內容替換內容:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
​
admin.initializeApp(functions.config().firebase);
​
exports.pushConfig = functions.remoteConfig.onUpdate(versionMetadata => {
    // Create FCM payload to send data message to REMOTE_CONFIG topic.
    const payload = {
        data: {
            CONFIG_STATE: 'STALE'
        }
    };
​
    const options = {
        content_available: true
    };
​
    // Use the Admin SDK to send the ping via FCM.
    return admin
        .messaging()
        .sendToTopic('REMOTE_CONFIG', payload, options)
        .then(response => {
            console.log(response);
        
            return null;
        });
});
複製代碼

咱們使用通知來傳遞帶有密鑰CONFIG_STATE的有效負載。這將向您的應用發出遠程配置數據已更改的信號。若有必要,選項content_available是必要的,以使iOS恢復應用程序或在後臺啓動它。

如今該功能已經到位,咱們能夠將其部署到Firebase,以便它能夠運行。

firebase deploy --only functions
複製代碼

這將部署到firebase init函數中選擇的Firebase項目。要部署到另外一個項目,首先使用firebase使用--add添加它。添加後,您可使用my-project-alias切換運行firebase的項目。

3.處理遠程推送

咱們須要在AppDelegate中實現方法:didReceiveRemoteNotification:fetchCompletionHandler:來處理傳入的推送通知。若是userInfo字典有密鑰CONFIG_STATE(咱們添加到通知有效負載的那個),那麼它就是咱們正在尋找的通知。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (_: UIBackgroundFetchResult) -> Void) {
    if userInfo["CONFIG_STATE"] != nil {
        UserDefaults.standard.set(true, forKey: "CONFIG_STATE")
        UserDefaults.standard.synchronize()
    }
​
    completionHandler(UIBackgroundFetchResult.newData)
}
複製代碼

這裏很容易調用fetchWithExpirationDuration:completionHandler:具備很是少的到期時間,以便在那時檢索更新的值。但這樣作會使全部通知的應用實例在大體相同的時間請求新值。這極可能會使應用受到限制,所以咱們會將其推遲到下一次發佈。

4. 使遠程配置緩存無效

咱們只須要將標誌保存到UserDefaults並在獲取Remote Config值以前進行檢查。

var expirationDuration: TimeInterval = 43200 // 12hs of cache by default
​
if UserDefaults.standard.bool(forKey: "CONFIG_STATE") {
    UserDefaults.standard.set(false, forKey: "CONFIG_STATE")
    UserDefaults.standard.synchronize()
            
    expirationDuration = 0
}
​
RemoteConfig.fetch(withExpirationDuration: expirationDuration) { [weak self] status, error in
    RemoteConfig.remoteConfig().activateFetched()
}
複製代碼

若是配置已過期,咱們將經過將到期持續時間設置爲0來繞過緩存。這將強制執行一次徹底從新加載,而沒必要等待緩存過時。

這就是全部的設置。如今轉到「遠程配置」面板併發布更改。而後查看「功能」選項卡。它應該以下所示:

日誌應該註冊成功執行:

總結

避免輪詢Firebase服務器以進行遠程配置更新的一種方法是讓雲功能在發佈更改時向您的應用發送靜默推送通知。而後,應用程序可使遠程配置緩存無效,並在下次啓動時請求新值。但要注意,手動關閉應用程序的用戶在從新啓動和解鎖手機以前不會收到這些推送通知。

求大佬們點個關注,會按期寫原創和翻譯國外最新文章,跟大佬們一塊兒學習進步,有問題或者建議歡迎加微信ruiwendelll,拉你們進技術交流羣,一塊兒探討學習,謝謝了!

相關文章
相關標籤/搜索