iOS中的實時遠程配置全紀錄
前言
當您需要快速推出遠程配置更改時該怎么辦?也許你做的上次更改沒有成功,你想盡快撤消它們。或者您的應用中出現(xiàn)了問題,您需要禁用整個功能。
更頻繁地調(diào)用fetchWithExpirationDuration:completionHandler:
(具有較少的到期時間)是一種方法,但Firebase不鼓勵這樣做。你冒著被下架的風險。
如果您需要使遠程配置緩存無效,而不必對短暫的到期時間進行硬編碼,該怎么辦?而不是反復詢問服務器更新,讓服務器在有更改時通知您。 Firebase遠程配置現(xiàn)在與云功能集成,因此可以在配置發(fā)布或回滾時觸發(fā)執(zhí)行。這意味著您可以讓一個函數(shù)向您的應用發(fā)送靜默推送通知,讓它知道配置已更改。
在AppDelegate中觸發(fā)回調(diào)時,不會向用戶顯示靜默推送通知。通過將選項content_available設置為true,您甚至可以在推送通知到達時讓iOS在后臺啟動您的應用程序(或恢復它)。一個問題:如果用戶手動殺死它,iOS將無法在后臺啟動您的應用程序。這將持續(xù)到下次重新啟動(第一次解鎖后)。除此之外,你沒有其他問題了。
實現(xiàn)
這個過程歸結(jié)為:
- 將應用程序訂閱到Firebase Cloud Messaging主題
- 創(chuàng)建在遠程配置更改時觸發(fā)的云功能
- 處理AppDelegate中的靜音推送通知
- 在下次啟動時使遠程配置緩存無效
如何設置Firebase云消息傳遞超出了本文的范圍,但文檔是一個很好的起點。
1.訂閱到主題
推送通知啟動并運行后,我們需要將應用訂閱到主題。我們將專門用于遠程配置。
Messaging.messaging().subscribe(toTopic: "REMOTE_CONFIG") { error in if let error = error { debugPrint("Could not subscribe to Remote Config topic", error) } }
2.創(chuàng)建一個云服務
Cloud Function只是一個Node.js腳本,因此您需要在您的計算機上使用Node.js.在撰寫本文時,Cloud Functions支持Node v6或Node v8,其中v6是默認值。
獲得Node.js后,首先安裝Firebase CLI。
npm install -g firebase-tools
然后使用CLI工具進行身份驗證。
firebase login
現(xiàn)在為函數(shù)創(chuàng)建一個文件夾,cd進入它并初始化Firebase項目。
firebase init functions
這將啟動CLI向?qū)?。完成它,你就準備好了?/p>
是時候添加將向REMOTE_CONFIG通道發(fā)送靜默推送通知的云功能。在新創(chuàng)建的項目的函數(shù)目錄中,您將找到index.js。打開它并用以下內(nèi)容替換內(nèi)容:
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的有效負載。這將向您的應用發(fā)出遠程配置數(shù)據(jù)已更改的信號。如有必要,選項content_available是必要的,以使iOS恢復應用程序或在后臺啟動它。
現(xiàn)在該功能已經(jīng)到位,我們可以將其部署到Firebase,以便它可以運行。
firebase deploy --only functions
這將部署到firebase init函數(shù)中選擇的Firebase項目。要部署到另一個項目,首先使用firebase使用--add添加它。添加后,您可以使用my-project-alias切換運行firebase的項目。
3.處理遠程推送
我們需要在AppDelegate中實現(xiàn)方法: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) }
這里很容易調(diào)用fetchWithExpirationDuration:completionHandler:具有非常少的到期時間,以便在那時檢索更新的值。但這樣做會使所有通知的應用實例在大致相同的時間請求新值。這很可能會使應用受到限制,因此我們會將其推遲到下一次發(fā)布。
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() }
如果配置已過時,我們將通過將到期持續(xù)時間設置為0來繞過緩存。這將強制執(zhí)行一次完全重新加載,而不必等待緩存過期。
這就是所有的設置?,F(xiàn)在轉(zhuǎn)到“遠程配置”面板并發(fā)布更改。然后查看“功能”選項卡。它應該如下所示:
日志應該注冊成功執(zhí)行:
總結(jié)
避免輪詢Firebase服務器以進行遠程配置更新的一種方法是讓云功能在發(fā)布更改時向您的應用發(fā)送靜默推送通知。然后,應用程序可以使遠程配置緩存無效,并在下次啟動時請求新值。但要注意,手動關閉應用程序的用戶在重新啟動和解鎖手機之前不會收到這些推送通知。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
iOS保存App中的照片到系統(tǒng)相冊或自建相冊的方法
這篇文章主要介紹了iOS保存App中的照片到系統(tǒng)相冊或自建相冊的方法,示例代碼為傳統(tǒng)的Objective-C語言寫成,需要的朋友可以參考下2016-04-04iOS中管理剪切板的UIPasteboard粘貼板類用法詳解
在iOS中,通過UITextField、UITextView和UIWebView剪切或復制的內(nèi)容都可以通過UIPasteboard類來管理粘貼操作,下面就為大家?guī)韎OS中管理剪切板的UIPasteboard粘貼板類用法詳解:2016-06-06iOS中setValue和setObject的區(qū)別詳解
setObject:ForKey: 是NSMutableDictionary特有的;setValue:ForKey:是KVC的主要方法。接下來通過本文給大家分享iOS中setValue和setObject的區(qū)別,需要的朋友參考下2017-02-02