SwiftUI框架詳細解析 (十八) —— Firebase Remote Config教程(一)

版本記錄

版本號 時間
V1.0 2021.01.03 星期日

前言

今天翻閱蘋果的API文檔寞钥,發(fā)現(xiàn)多了一個框架SwiftUI氛赐,這里我們就一起來看一下這個框架呻疹。感興趣的看下面幾篇文章暴构。
1. SwiftUI框架詳細解析 (一) —— 基本概覽(一)
2. SwiftUI框架詳細解析 (二) —— 基于SwiftUI的閃屏頁的創(chuàng)建(一)
3. SwiftUI框架詳細解析 (三) —— 基于SwiftUI的閃屏頁的創(chuàng)建(二)
4. SwiftUI框架詳細解析 (四) —— 使用SwiftUI進行蘋果登錄(一)
5. SwiftUI框架詳細解析 (五) —— 使用SwiftUI進行蘋果登錄(二)
6. SwiftUI框架詳細解析 (六) —— 基于SwiftUI的導(dǎo)航的實現(xiàn)(一)
7. SwiftUI框架詳細解析 (七) —— 基于SwiftUI的導(dǎo)航的實現(xiàn)(二)
8. SwiftUI框架詳細解析 (八) —— 基于SwiftUI的動畫的實現(xiàn)(一)
9. SwiftUI框架詳細解析 (九) —— 基于SwiftUI的動畫的實現(xiàn)(二)
10. SwiftUI框架詳細解析 (十) —— 基于SwiftUI構(gòu)建各種自定義圖表(一)
11. SwiftUI框架詳細解析 (十一) —— 基于SwiftUI構(gòu)建各種自定義圖表(二)
12. SwiftUI框架詳細解析 (十二) —— 基于SwiftUI創(chuàng)建Mind-Map UI(一)
13. SwiftUI框架詳細解析 (十三) —— 基于SwiftUI創(chuàng)建Mind-Map UI(二)
14. SwiftUI框架詳細解析 (十四) —— 基于Firebase Cloud Firestore的SwiftUI iOS程序的持久性添加(一)
15. SwiftUI框架詳細解析 (十五) —— 基于Firebase Cloud Firestore的SwiftUI iOS程序的持久性添加(二)
16. SwiftUI框架詳細解析 (十六) —— 基于SwiftUI簡單App的Dependency Injection應(yīng)用(一)
17. SwiftUI框架詳細解析 (十七) —— 基于SwiftUI簡單App的Dependency Injection應(yīng)用(二)

開始

首先看下主要內(nèi)容:

在本教程中盗飒,您將學(xué)習(xí)Firebase Remote Config教程。內(nèi)容來自翻譯圆裕。

接著看下寫作環(huán)境

Swift 5, iOS 14, Xcode 12

接著就是正文啦广鳍。

還記得您發(fā)布應(yīng)用程序的那段時間,它在各個方面都很完美嗎吓妆?您再也不必觸碰另一行代碼了赊时,因為您在第一時間就設(shè)法使所有內(nèi)容正確無誤?

成為成功的應(yīng)用程序開發(fā)人員通常意味著經(jīng)常更改您的應(yīng)用程序行拢。有時祖秒,這些更改是新功能或錯誤bug。但有時舟奠,最有影響力的更新是對代碼的單行更改竭缝,例如,調(diào)整文本行或在塔防游戲中使用強大的單元沼瘫。

盡管很容易進行這些更改抬纸,但是發(fā)布它們?nèi)匀皇且粋€為期數(shù)天的過程。如果您不必進行整個過程就可以進行一些調(diào)整耿戚,那會很好嗎湿故?

Firebase Remote Config可為您提供這種功能。在整個教程中膜蛔,您將使用PlanetTour示例應(yīng)用程序來學(xué)習(xí)如何更改文本坛猪,顏色和其他行為,而不必發(fā)布新版本皂股!您將可以避免通過App Store批準(zhǔn)發(fā)布過程墅茉,并立即向您的用戶進行一些小的更改。掌握了簡單的調(diào)整后呜呐,您將學(xué)到更強大的功能就斤,可以為不同的用戶提供不同的內(nèi)容集。

先決條件:本教程假定您已熟悉CocoaPods并已安裝卵史。如果您不這樣做战转,請查看我們的CocoaPods tutorial搜立。

打開入門項目應(yīng)用程序以躯。輕掃以查看不同的行星,然后輕按每個以獲取一些(大多是準(zhǔn)確的)額外信息。

您剛剛下載的應(yīng)用是由PlanetTour Apps忧设,Inc.開發(fā)的刁标,事情進展順利,直到有一天址晕,市場營銷人員Greg決定PlanetTour應(yīng)該改用綠色方案來慶祝Earth Day膀懈。

這很容易解決-如果您查看AppConstants.swift,可以更改appPrimaryColor屬性谨垃,這會影響許多文本標(biāo)簽的顏色启搂。向用戶推送此更改將涉及發(fā)布新版本,將其提交到App Store刘陶,獲得批準(zhǔn)胳赌,然后希望所有用戶在地球日之前下載它。地球日結(jié)束后匙隔,您必須再次執(zhí)行整個過程以還原更改疑苫。

如果您只是可以從云中更改這些值,那豈不是很好嗎纷责?


Installing the Remote Config Library

要開始使用Remote Config而不是AppConstants中當(dāng)前使用的硬編碼值捍掺,您需要在Firebase Console中創(chuàng)建一個項目,將其與PlanetTour應(yīng)用程序關(guān)聯(lián)再膳,然后安裝Firebase Remote Config庫挺勿。

1. Creating a Project in Firebase Console

第一步是創(chuàng)建一個項目。去做這個:

  • 1) 打開firebase.google.com/console
  • 2) 單擊Add project喂柒。
  • 3) 將項目命名為PlanetTour满钟,然后單擊Continue
  • 4) 接下來,請確保已選中Enable Google Analytics for this project胳喷,然后單擊Continue
  • 5) 接下來湃番,選擇一個現(xiàn)有的Google Analytics(分析)帳戶或創(chuàng)建一個帳戶,然后單擊Create project

您已經(jīng)創(chuàng)建了項目吭露! 現(xiàn)在吠撮,您必須將其與PlanetTour應(yīng)用程序關(guān)聯(lián)。

2. Associating the Project with the PlanetTour App

創(chuàng)建項目后讲竿,您將被重定向到應(yīng)用程序的主頁泥兰。 要將項目與應(yīng)用程序連接:

  • 1) 通過單擊iOS logo徽標(biāo)添加iOS應(yīng)用:
  • 2) 添加項目的bundle ID(即com.raywenderlich.PlanetTour)和應(yīng)用程序昵稱(PlanetTour),但將App Store ID字段保留為空白题禀,然后單擊Register App
  • 3) 單擊下載按鈕以下載GoogleServices-info.plist文件:
  • 4) 此時鞋诗,您的瀏覽器將為您下載GoogleServices-info.plist文件。 將此文件拖到您的Xcode項目中迈嘹,如上Firebase說明中的屏幕截圖所示削彬。 如果需要全庸,請確保選擇Copy Items if Needed
  • 5) 在安裝向?qū)У钠溆鄮讉€步驟中融痛,單擊Next壶笼。 不用擔(dān)心:接下來,您將逐步完成這些說明雁刷。 通過單擊Continue to Console完成向?qū)В?/li>
  • 6) 切換回Xcode并關(guān)閉PlanetTour項目覆劈。

您現(xiàn)在快到了! 但是您仍然必須安裝Remote Config Library沛励。

3. Installing the Firebase Remote Config Library

您需要啟用您的應(yīng)用程序才能在互聯(lián)網(wǎng)上找到新的價值责语。 去做這個:

  • 1) 打開終端窗口,然后導(dǎo)航到您的項目目派。 最簡單的方法是鍵入cd末尾帶有空格)鹦筹,然后等待提交命令。 然后打開Finder窗口并找到包含Xcode項目的文件夾址貌。 將文件夾從Finder拖放到Terminal中铐拐。 文件夾的位置將被填充到Terminal中的命令中。 在終端中按鍵盤上的Return鍵以提交命令练对。
  • 2) 鍵入pod init遍蟋,然后按Return鍵在項目文件夾中創(chuàng)建一個基本Podfile
  • 3) 使用您喜歡的文本編輯器打開Podfile螟凭,并將其內(nèi)容替換為以下內(nèi)容虚青,然后保存:
target 'PlanetTour' do
  # Comment this line if you're not using Swift 
  # and don't want to use dynamic frameworks
  use_frameworks!
  platform :ios, '12.0'

  # Pods for PlanetTour
  pod 'Firebase/Core', '~> 7.0.0'
  pod 'Firebase/RemoteConfig', '~> 7.0.0'

  # Remove Xcode 12 warnings
  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      end
    end
  end
end
  • 4) 在終端中運行pod install
  • 5) 使用Xcode打開新的PlanetTour.xcworkspace螺男。 (注意:您需要工作空間棒厘,而不是項目。)工作空間合并了Podfile中指定的CocoaPods中的代碼下隧。

注意:確保打開正確文件的一種簡單方法是在終端中輸入以下命令:

xed .
  • 6) 使用項目導(dǎo)航器打開AppDelegate.swift奢人。 在下面的導(dǎo)入UIKit中添加以下內(nèi)容:
import Firebase

接下來,在return語句之前將以下實現(xiàn)添加到application(_:didFinishLaunchingWithOptions :)

FirebaseApp.configure()

此方法使用添加GoogleServices-info.plist文件時為項目提供的常量來檢查已安裝的庫并對其進行初始化淆院。 Remote Config庫現(xiàn)在知道在Internet上可以找到新值的位置何乎。

再次構(gòu)建并運行您的應(yīng)用程序。 該應(yīng)用程序的外觀應(yīng)與以前相同土辩,只是您會在控制臺輸出中看到以前沒有看到的調(diào)試信息支救。

恭喜你! 您已經(jīng)安裝了Remote Config拷淘! 現(xiàn)在各墨,您可以在本教程的其余部分中使用它。


How Remote Config Works

過于簡化启涯,Remote Config的工作原理類似于云中的[String:Any贬堵?]字典恃轩。 當(dāng)您的應(yīng)用啟動時,它會從云中獲取可能需要的所有新值扁瓢,然后將其應(yīng)用到您可能已指定為默認值的所有舊值之上详恼。

使用Remote Config的一般過程如下所示:

  • 1) 為Remote Config提供默認值补君,以備將來更改引几。
  • 2) 從云中獲取任何新值。 您可以在設(shè)備上以緩存的保留模式找到它們挽铁。
  • 3) “激活”那些獲取的值伟桅。 發(fā)生這種情況時,它會將這些獲取的值應(yīng)用到您現(xiàn)有的默認值之上叽掘。
  • 4) 查詢Remote Config的值楣铁。 如果找到,Remote Config將為您提供來自云的值更扁,或者基于所提供密鑰的默認值盖腕。

需要注意的一件事是,您獲取的這些新值通常是您提供的默認值的子集浓镜。 您幾乎可以在您的應(yīng)用程序中使用任何硬編碼的字符串溃列,數(shù)字或布爾值,并將其連接起來以使用Remote Config膛薛。 這使您可以靈活地在以后更改應(yīng)用程序的許多方面听隐,同時仍然保持實際的網(wǎng)絡(luò)通話大小。

足夠的理論哄啄。 是時候?qū)⑵涓吨T實踐了雅任!


Using Remote Config

首先,在Xcode的Project導(dǎo)航器中選擇Utilities文件夾咨跌。 右鍵單擊以創(chuàng)建一個新文件沪么。 選擇Swift文件。 將其命名為RCValues.swift并在Xcode建議的默認文件夾中創(chuàng)建它锌半。

將以下內(nèi)容添加到文件末尾:

import Firebase

class RCValues {
  static let sharedInstance = RCValues()

  private init() {
    loadDefaultValues()
  }

  func loadDefaultValues() {
    let appDefaults: [String: Any?] = [
      "appPrimaryColor": "#FBB03B"
    ]
    RemoteConfig.remoteConfig().setDefaults(appDefaults as? [String: NSObject])
  }
}

在這里成玫,您將Singleton模式用于RCValues。 您將可以從項目中任何位置的sharedInstance訪問值拳喻。 在loadDefaultValues()內(nèi)部哭当,您將一組鍵和值作為默認值傳遞給Remote Config。 目前冗澈,您只提供一個值钦勘,但不用擔(dān)心,以后會添加更多亚亲。

1. Fetching Values From the Cloud

接下來彻采,您需要讓Remote Config從云中獲取新值腐缤。 在類的右花括號之前,在loadDefaultValues()下添加以下方法:

func activateDebugMode() {
  let settings = RemoteConfigSettings()
  // WARNING: Don't actually do this in production!
  settings.minimumFetchInterval = 0
  RemoteConfig.remoteConfig().configSettings = settings
}

默認情況下肛响,Remote Config將緩存從云中檢索到的所有值大約12個小時岭粤。 客戶端節(jié)流閥可確保您不會頻繁ping通該服務(wù)。 在生產(chǎn)應(yīng)用中特笋,這可能很好剃浇。 但是,當(dāng)您進行開發(fā)時–或在線閱讀Firebase Remote Config教程時–這會使測試新值變得非常困難猎物。 因此虎囚,您指定的minimumFetchInterval0,以確保您永遠不會使用緩存的數(shù)據(jù)蔫磨。

添加以下方法以獲取這些值:`

func fetchCloudValues() {
  // 1
  activateDebugMode()

  // 2
  RemoteConfig.remoteConfig().fetch { [weak self] _, error in
    if let error = error {
      print("Uh-oh. Got an error fetching remote values \(error)")
      // In a real app, you would probably want to call the loading 
      // done callback anyway, and just proceed with the default values. 
      // I won't do that here, so we can call attention
      // to the fact that Remote Config isn't loading.
      return
    }

    // 3
    RemoteConfig.remoteConfig().activate { _, _ in
      print("Retrieved values from the cloud!")
    }
  }
}

這是該代碼中發(fā)生的事情:

  • 1) 通過啟用調(diào)試模式淘讥,您可以告訴Remote Config繞過客戶端的限制。出于開發(fā)目的或與10人團隊進行測試堤如,這很好蒲列。但是,如果您與數(shù)百萬名支持者一起向公眾發(fā)布此應(yīng)用搀罢,那么您將很快達到服務(wù)器端的要求蝗岖,并且Remote Config將停止工作。這就是您首先使用客戶端節(jié)流閥的全部原因魄揉。在真正啟動該應(yīng)用之前剪侮,請確保禁用調(diào)試模式,并將minimumFetchInterval設(shè)置為更合理的值洛退,例如43200瓣俯,這對您和我來說都是12個小時。
  • 2) 如果在獲取過程中Remote Config遇到錯誤兵怯,它將在應(yīng)用獲取的值之前退出彩匕。不要擔(dān)心weak self的警告。您將在本教程的后面部分添加代碼以解決警告媒区。
  • 3) 如果從云端成功下載了值驼仪,則Remote Config將使用新值,而不是應(yīng)用程序中硬編碼的默認值袜漩。

將以下內(nèi)容添加到init()的末尾以調(diào)用新方法:

fetchCloudValues()

2. Running Your Code

打開AppDelegate.swift并將以下內(nèi)容添加到FirebaseApp.configure()下的application(_:didFinishLaunchingWithOptions :)中:

_ = RCValues.sharedInstance

下劃線字符表示您不打算使用常量名稱绪爸。 只需訪問sharedInstance的值,即可對其進行初始化并填充其默認值宙攻。

構(gòu)建并運行您的應(yīng)用程序奠货,您將在調(diào)試控制臺中看到以下行:

Retrieved values from the cloud!

Using Remote Config Values

現(xiàn)在,您正在下載這些值座掘,請嘗試將它們打印到控制臺递惋。 打開RCValues.swift柔滔,然后將以下內(nèi)容添加到fetchCloudValues()中,緊接在“Retrieved values from the cloud”行之后:

print("""
  Our app's primary color is \
  \(RemoteConfig.remoteConfig().configValue(forKey: "appPrimaryColor"))
  """)

上面的代碼將為您的appPrimaryColor鍵獲取適當(dāng)?shù)闹怠?/p>

構(gòu)建并運行您的應(yīng)用程序萍虽。 您應(yīng)該看到這樣的一行:

Our app's primary color is <FIRRemoteConfigValue: 0x61000003ece0>

嗯睛廊,這很有用,但是您希望有一個字符串值杉编。

Remote Config將值檢索為RemoteConfigValue對象超全。 您可以將它們視為基礎(chǔ)數(shù)據(jù)的包裝,這些數(shù)據(jù)在內(nèi)部以UTF8編碼的字符串表示王财。 您幾乎永遠不會直接使用此對象卵迂。 相反裕便,您將調(diào)用諸如numberValueboolValue之類的幫助器方法來檢索所需的實際值绒净。

將您剛添加的行替換為:

let appPrimaryColorString = RemoteConfig.remoteConfig()
  .configValue(forKey: "appPrimaryColor")
  .stringValue ?? "undefined"
print("Our app's primary color is \(appPrimaryColorString)")

構(gòu)建并運行您的應(yīng)用程序。 這次您會看到:

Our app's primary color is #FBB03B

這還差不多偿衰。 Remote Config為您提供了您之前提供的十六進制顏色代碼的默認值挂疆。

1. Updating Values From the Cloud

現(xiàn)在您已從Remote Config獲取了正確的值,請嘗試從云中提供新的值下翎。

打開Firebase Console缤言。 在左側(cè)邊欄中查看并展開Engage部分。 單擊Remote Config選項:

單擊Add a parameter视事。 在表單中胆萧,輸入keyappPrimaryColor,并輸入Marketing喜愛的新綠色#36C278中的Greg作為值俐东。

單擊Add Parameter跌穗,然后單擊兩次Publish Changes以更新更改。

構(gòu)建并運行您的應(yīng)用程序虏辫。

現(xiàn)在查看控制臺中的內(nèi)容:

Our app's primary color is #36C278

您正在從云中更新價值蚌吸!


Changing Your App’s Look and Feel

現(xiàn)在,該掛斷您的應(yīng)用程序以使用此新值了砌庄。

首先,添加一個enum來表示您的密鑰。 使用原始字符串作為鍵名是災(zāi)難的根源信轿,或者至少您會花一個下午的時間來尋找一個神秘的bug佛纫,因為您鍵入了一個錯誤的鍵名。 通過使用枚舉萌焰,Swift可以在編譯時而不是運行時捕獲錯誤哺眯。

打開RCValues.swift并在類定義上方添加以下內(nèi)容:

enum ValueKey: String {
  case appPrimaryColor
}

接下來,更新loadDefaultValues()以使用此枚舉而不是原始字符串:

let appDefaults: [String: Any?] = [
  ValueKey.appPrimaryColor.rawValue : "#FBB03B"
]

接下來杆怕,將以下幫助方法添加到RCValues中族购,該方法接受ValueKey并基于Remote Config中的字符串返回UIColor

func color(forKey key: ValueKey) -> UIColor {
  let colorAsHexString = RemoteConfig.remoteConfig()[key.rawValue]
    .stringValue ?? "#FFFFFF"
  let convertedColor = UIColor(colorAsHexString)
  return convertedColor
}

最后壳贪,使用舊的AppConstants值更改應(yīng)用程序中的位置,以改用此新的RCValues幫助器方法寝杖。

在三個位置執(zhí)行此操作:

  • 1) 打開ContainerViewController.swift并在updateBanner()中更改以下內(nèi)容:
bannerView.backgroundColor = AppConstants.appPrimaryColor

為下面

bannerView.backgroundColor = RCValues.sharedInstance
  .color(forKey: .appPrimaryColor)
  • 2) 打開GetNewsletterViewController.swift并在updateSubmitButton()中更改以下內(nèi)容:
submitButton.backgroundColor = AppConstants.appPrimaryColor

submitButton.backgroundColor = RCValues.sharedInstance
  .color(forKey: .appPrimaryColor)
  • 3) 打開PlanetDetailViewController.swift并在updateLabelColors()中更改以下內(nèi)容:
nextLabel.textColor = AppConstants.appPrimaryColor

nextLabel.textColor = RCValues.sharedInstance.color(forKey: .appPrimaryColor)

要徹底违施,請打開AppConstants.swift并刪除以下內(nèi)容:

static let appPrimaryColor = UIColor(rgba: "#FBB03B")

稍后再見,硬編碼值...

現(xiàn)在瑟幕,構(gòu)建并運行您的應(yīng)用程序磕蒲。 您應(yīng)該在整個應(yīng)用程序中看到新的綠色:

1. Addressing the Timing of New Values

您什么時候應(yīng)用這些新值沒有太多控制權(quán)。 首次運行該應(yīng)用程序時只盹,您可能會在主菜單上看到默認的橙色辣往,但是一旦從云中加載了新值,行星詳細信息屏幕上就會顯示新的綠色殖卑。

這會使您的用戶感到困惑站削。 在這種情況下,您只需要更改一些標(biāo)簽顏色孵稽,但是如果您的應(yīng)用在用戶運行時更改了影響其行為的文本或值许起,則可能會造成困惑。

您可以通過多種方式處理此問題菩鲜,但最簡單的方法可能是創(chuàng)建加載屏幕园细。 在本教程中,已經(jīng)為您進行了部分設(shè)置接校。


Hooking Up a Loading Screen

首先猛频,使loading screen成為應(yīng)用程序的初始視圖控制器。 打開Main.storyboard并按住Control鍵的同時從導(dǎo)航控制器到Waiting View Controller -這是黑色背景的視圖控制器蛛勉,盡管在Storyboard輪廓中執(zhí)行此Control-拖動可能會更容易鹿寻。 從彈出窗口中選擇根視圖控制器root view controller,以使您的加載屏幕在應(yīng)用加載時成為初始屏幕董习。

現(xiàn)在烈和,添加邏輯,以在Remote Config完成加載后過渡到主菜單皿淋。

打開RCValues.swift招刹,在sharedInstance屬性下面添加以下內(nèi)容:

var loadingDoneCallback: (() -> Void)?
var fetchComplete = false

接下來,找到fetchCloudValues()并在打印應(yīng)用程序原色的行之后添加以下內(nèi)容:

self?.fetchComplete = true
DispatchQueue.main.async {
  self?.loadingDoneCallback?()
}

在這里窝趣,將fetchComplete設(shè)置為true疯暑,表示獲取已完成。 最后哑舒,您調(diào)用可選的回調(diào)妇拯,以通知偵聽器Remote Config值已完成加載。 您可以使用此命令告訴加載屏幕自行關(guān)閉。

打開WaitingViewController.swift并添加以下方法:

func startAppForReal() {
  performSegue(withIdentifier: "loadingDoneSegue", sender: self)
}

接下來越锈,將viewDidLoad()替換為以下內(nèi)容:

override func viewDidLoad() {
  super.viewDidLoad()

  if RCValues.sharedInstance.fetchComplete {
    startAppForReal()
  }

  RCValues.sharedInstance.loadingDoneCallback = startAppForReal
}

在這里仗嗦,您要使startAppForReal()在所有值完成加載后由RCValues方法調(diào)用。 您還添加了一張check甘凭,以防RCValues在等待屏幕完成加載之前設(shè)法完成網(wǎng)絡(luò)通話稀拐。 這永遠都不會發(fā)生,但是防御性地編寫代碼也不會造成傷害丹弱!

托德(Todd)的編碼規(guī)則:在代碼注釋中添加“This should never happen”德撬,可以確保在某些時候確實會發(fā)生這種情況。

構(gòu)建并運行躲胳。 您會看到等待屏幕一會兒蜓洪,具體取決于您的網(wǎng)絡(luò)速度,然后跳入應(yīng)用程序的其余部分坯苹。 如果您在Firebase控制臺中更改應(yīng)用原色的值并重新啟動應(yīng)用隆檀,則新顏色將正確顯示在應(yīng)用中的任何位置。 請記住在Firebase控制臺中單擊Publish Changes北滥。


Hook Up the Rest of Your App

現(xiàn)在刚操,您已經(jīng)將一個值從AppConstants轉(zhuǎn)換為RCValues闸翅,現(xiàn)在可以轉(zhuǎn)換其余的值了再芋! 在本部分中,您將在幕后看到如何連接應(yīng)用程序坚冀。 您還將看到如何組織Remote Config的支持代碼济赎,以后可以將其應(yīng)用于自己的應(yīng)用。

打開RCValues.swift并將ValueKey替換為以下內(nèi)容:

enum ValueKey: String {
  case bigLabelColor
  case appPrimaryColor
  case navBarBackground
  case navTintColor
  case detailTitleColor
  case detailInfoColor
  case subscribeBannerText
  case subscribeBannerButton
  case subscribeVCText
  case subscribeVCButton
  case shouldWeIncludePluto
  case experimentGroup
  case planetImageScaleFactor
}

接下來记某,將loadDefaultValues()替換為以下內(nèi)容:

func loadDefaultValues() {
  let appDefaults: [String: Any?] = [
    ValueKey.bigLabelColor.rawValue: "#FFFFFF66",
    ValueKey.appPrimaryColor.rawValue: "#FBB03B",
    ValueKey.navBarBackground.rawValue: "#535E66",
    ValueKey.navTintColor.rawValue: "#FBB03B",
    ValueKey.detailTitleColor.rawValue: "#FFFFFF",
    ValueKey.detailInfoColor.rawValue: "#CCCCCC",
    ValueKey.subscribeBannerText.rawValue: "Like PlanetTour?",
    ValueKey.subscribeBannerButton.rawValue: "Get our newsletter!",
    ValueKey.subscribeVCText
      .rawValue: "Want more astronomy facts? Sign up for our newsletter!",
    ValueKey.subscribeVCButton.rawValue: "Subscribe",
    ValueKey.shouldWeIncludePluto.rawValue: false,
    ValueKey.experimentGroup.rawValue: "default",
    ValueKey.planetImageScaleFactor.rawValue: 0.33
  ]
  RemoteConfig.remoteConfig().setDefaults(appDefaults as? [String: NSObject])
}

接下來司训,最后在color(forKey :)下面添加三個輔助方法,以允許檢索除colors之外的值:

func bool(forKey key: ValueKey) -> Bool {
  RemoteConfig.remoteConfig()[key.rawValue].boolValue
}

func string(forKey key: ValueKey) -> String {
  RemoteConfig.remoteConfig()[key.rawValue].stringValue ?? ""
}

func double(forKey key: ValueKey) -> Double {
  RemoteConfig.remoteConfig()[key.rawValue].numberValue.doubleValue
}

接下來液南,將使用AppConstants的應(yīng)用程序的每個部分替換為對RCValues的相應(yīng)調(diào)用壳猜。

您將在整個應(yīng)用程序中進行九項更改:

  • 1) 打開ContainerViewController.swift并將updateNavigationColors()替換為以下內(nèi)容:
func updateNavigationColors() {
  navigationController?.navigationBar.tintColor = RCValues.sharedInstance
    .color(forKey: .navTintColor)
}
  • 2) 將updateBanner()替換為以下內(nèi)容:
func updateBanner() {
  bannerView.backgroundColor = RCValues.sharedInstance
    .color(forKey: .appPrimaryColor)
  bannerLabel.text = RCValues.sharedInstance
    .string(forKey: .subscribeBannerText)
  getNewsletterButton.setTitle(RCValues.sharedInstance
    .string(forKey: .subscribeBannerButton), for: .normal)
}
  • 3) 打開GetNewsletterViewController.swift并將updateText()替換為以下內(nèi)容:
func updateText() {
  instructionLabel.text = RCValues.sharedInstance
    .string(forKey: .subscribeVCText)
  submitButton.setTitle(RCValues.sharedInstance
    .string(forKey: .subscribeVCButton), for: .normal)
}
  • 4) 打開PlanetDetailViewController.swift并在updateLabelColors()中替換以下行:
nextLabel.textColor = AppConstants.detailInfoColor

nextLabel.textColor = RCValues.sharedInstance.color(forKey: .detailInfoColor)
  • 5) 替換一行
planetNameLabel.textColor = AppConstants.detailTitleColor

planetNameLabel.textColor = RCValues.sharedInstance
  .color(forKey: .detailTitleColor)
  • 6) 打開PlanetsCollectionViewController.swift,然后在customNavigationBar()中替換以下行:
navBar.barTintColor = AppConstants.navBarBackground

navBar.barTintColor = RCValues.sharedInstance
  .color(forKey: .navBarBackground)
  • 7) 在collectionView(_:cellForItemAt:)替換行
cell.nameLabel.textColor = AppConstants.bigLabelColor

cell.nameLabel.textColor = RCValues.sharedInstance
  .color(forKey: .bigLabelColor)
  • 8) 打開SolarSystem.swift滑凉,并在init()中替換以下行:
if AppConstants.shouldWeIncludePluto {

if RCValues.sharedInstance.bool(forKey: .shouldWeIncludePluto) {
  • 9) 最后统扳,在calculatePlanetScales()內(nèi)部,替換以下行:
scaleFactors.append(pow(ratio, AppConstants.planetImageScaleFactor))

scaleFactors.append(pow(
  ratio, 
  RCValues.sharedInstance.double(forKey: .planetImageScaleFactor)))

這是很多更改畅姊,但是現(xiàn)在您應(yīng)該切換整個應(yīng)用程序咒钟。 要完成重構(gòu),請在您的應(yīng)用程序中搜索AppConstants —— 您只剩下一個結(jié)果若未,該結(jié)果定義了結(jié)構(gòu)體本身:

確實可以使用Project導(dǎo)航器找到AppConstants.swift文件朱嘴,選擇并刪除它。 構(gòu)建并運行粗合。 如果重構(gòu)成功萍嬉,則不會看到任何錯誤乌昔。

現(xiàn)在,您的應(yīng)用已完全連接到Remote Config壤追,您可以進行其他更改玫荣,除了Greg非常喜歡的綠色之外。

1. Adding Further Changes to Your App

打開Firebase Console大诸。 確保您位于Remote Config部分捅厂,然后單擊Add Parameter。 鍵入navBarBackground作為鍵资柔,并輸入#35AEB1作為新值焙贷,然后單擊Add Parameter。 然后執(zhí)行相同的操作贿堰,將navTintColor設(shè)置為#FFFFFF辙芍。 單擊Publish Changes,然后在模式框中確認以將這些更改發(fā)布到您的應(yīng)用程序羹与。

完成后故硅,您的控制臺應(yīng)如下所示:

切換回Xcode,然后構(gòu)建并運行纵搁。

輕按一個行星吃衅,您的應(yīng)用程序應(yīng)如下所示:

隨意玩! 更改其他一些值腾誉。 亂七八糟的文字徘层。 看看您可以想出哪種時尚的(或艷麗的)顏色組合。

但是利职,當(dāng)您完成后趣效,請返回本教程,因為您要處理國際危機猪贪!


Bringing Back Pluto

Denmark的情況糟透了跷敬! 盡管全世界大多數(shù)人已經(jīng)接受了冥王星不是行星的想法,但斯堪的納維亞保護冥王星學(xué)會是一個由狂熱的冥王星粉絲組成的完全沒有組成的學(xué)會热押,一直游說著冥王星成為行星西傀,因此, 值得列入PlanetTour應(yīng)用程序楞黄。 抗議活動在哥本哈根的街道上不斷增加池凄! 你能做什么?

對于Remote Config來說鬼廓,這似乎很簡單肿仑! 您可以將shouldWeIncludePluto設(shè)置為true。 但是請稍候-這將為您的所有用戶(不僅是斯堪的納維亞半島的用戶)更改此設(shè)置。 您如何才能僅向講不同語言的人提供不同的設(shè)置尤慰?

1. Conditions to the Rescue!

Remote Config能夠?qū)⒉煌臄?shù)據(jù)集提供給不同的用戶馏锡,這使其不僅比云中的簡單字典還復(fù)雜。 利用此功能伟端,讓斯堪的納維亞用戶再次將冥王星變成一顆行星杯道。

首先,打開Firebase Console责蝠,確保您位于Remote Config面板中党巾,然后單擊Add Parameter以添加新參數(shù)。

輸入shouldWeIncludePluto作為參數(shù)鍵霜医。

接下來齿拂,單擊Add value for condition字段旁邊的下拉列表。

接下來肴敛,選擇Define New Condition

在對話框中署海,為新條件命名為Pluto Fans

在下面的下拉菜單中医男,選擇Languages砸狞。

從語言列表中,選擇Danish, Finnish, Icelandic, Norwegian and Swedish

單擊Create Condition镀梭。

接下來刀森,在Value for Pluto Fans字段中添加值true,將值false作為Default value

最后丰辣,單擊Add Parameter撒强,然后單擊Publish Changes以將這些更改推向世界。

構(gòu)建并運行以查看結(jié)果笙什。

如果您不會說這些北方語言中的一種,就不會在行星列表中看到冥王星Pluto胚想。 如果您想為斯堪的納維亞用戶測試體驗琐凭,我建議您預(yù)訂飛往哥本哈根的航班,為自己購買新的丹麥iPhone浊服,然后在上面運行您的應(yīng)用程序-也許同時享受煙熏三文魚统屈,開面三明治。

更節(jié)儉的選擇(可能會減少時差)是在設(shè)備或模擬器上打開Settings應(yīng)用程序牙躺。 選擇General > Language & Region > iPhone Language > Dansk - 或您喜歡的斯堪的納維亞語言:

It’s slightly cheaper than a trip to Copenhagen, but also less fun

構(gòu)建并運行您的應(yīng)用程序愁憔。 這次,您應(yīng)該看到冥王星回到它所屬的星球孽拷,以及其他行星吨掌。 避免了國際危機!

Welcome back, Pluto. We missed you!

另一種無需擺弄模擬器設(shè)置的測試方法是,用Option鍵單擊Xcode中的Run按鈕膜宋。 在出現(xiàn)的對話框中窿侈,單擊Options窗格,然后在App Language菜單中選擇適當(dāng)?shù)恼Z言秋茫。

本教程中還沒有涉及更多功能史简。例如,通過將值傳遞給隨機的用戶組肛著,您可以運行A / B測試或逐步推出新功能圆兵。您還可以向在Firebase Analytics中確定的特定人群提供不同的數(shù)據(jù)集,從而為您提供一些不錯的自定義功能枢贿。在本教程中衙傀,您使用了電話上的Language設(shè)置來對用戶進行分組,但是您也可以使用其IP地址在地理上對用戶進行分組萨咕,以確定他們所居住的國家/地區(qū)统抬。查看文檔documentationnext tutorial on this topic

現(xiàn)在您已經(jīng)有了基礎(chǔ)危队,使用Remote Config可以做更多的事情聪建。如果您正在開發(fā)任何類型的游戲,如果玩家發(fā)現(xiàn)游戲太容易或太難茫陆,它都是調(diào)整游戲玩法的好方法金麸。這也是創(chuàng)建“Message of the Day”功能的一種簡便方法〔局眩或者挥下,您可以僅使用它來嘗試其他按鈕或標(biāo)簽文本,以查看您的用戶的最佳反應(yīng)桨醋。在您喜歡的應(yīng)用程序中嘗試一下棚瘟,看看您可以即時更改什么!

后記

本篇主要講述了Firebase Remote Config教程喜最,感興趣的給個贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偎蘸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迷雪,更是在濱河造成了極大的恐慌能真,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倡缠,死亡現(xiàn)場離奇詭異,居然都是意外死亡丘损,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門沙廉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亮隙,“玉大人维费,你說我怎么就攤上這事阅畴∨Ω纾” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵彰触,是天一觀的道長。 經(jīng)常有香客問我棠耕,道長余佛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任窍荧,我火速辦了婚禮辉巡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蕊退。我一直安慰自己郊楣,他們只是感情好憔恳,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著净蚤,像睡著了一般钥组。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上今瀑,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天程梦,我揣著相機與錄音,去河邊找鬼放椰。 笑死作烟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砾医。 我是一名探鬼主播拿撩,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼如蚜!你這毒婦竟也來了压恒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤错邦,失蹤者是張志新(化名)和其女友劉穎探赫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撬呢,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡伦吠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了魂拦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毛仪。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芯勘,靈堂內(nèi)的尸體忽然破棺而出箱靴,到底是詐尸還是另有隱情,我是刑警寧澤荷愕,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布衡怀,位于F島的核電站,受9級特大地震影響安疗,放射性物質(zhì)發(fā)生泄漏抛杨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一荐类、第九天 我趴在偏房一處隱蔽的房頂上張望蝶桶。 院中可真熱鬧,春花似錦掉冶、人聲如沸真竖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恢共。三九已至,卻和暖如春璧亚,著一層夾襖步出監(jiān)牢的瞬間讨韭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工癣蟋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留透硝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓疯搅,卻偏偏與公主長得像濒生,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幔欧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容