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

版本記錄

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

前言

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

開始

首先看下主要內容:

在本教程中,您將學習Firebase Remote Config教程。內容來自翻譯

接著看下寫作環境

Swift 5, iOS 14, Xcode 12

接著就是正文啦。

還記得您發布應用程序的那段時間,它在各個方面都很完美嗎?您再也不必觸碰另一行代碼了,因為您在第一時間就設法使所有內容正確無誤?

成為成功的應用程序開發人員通常意味著經常更改您的應用程序。有時,這些更改是新功能或錯誤bug。但有時,最有影響力的更新是對代碼的單行更改,例如,調整文本行或在塔防游戲中使用強大的單元。

盡管很容易進行這些更改,但是發布它們仍然是一個為期數天的過程。如果您不必進行整個過程就可以進行一些調整,那會很好嗎?

Firebase Remote Config可為您提供這種功能。在整個教程中,您將使用PlanetTour示例應用程序來學習如何更改文本,顏色和其他行為,而不必發布新版本!您將可以避免通過App Store批準發布過程,并立即向您的用戶進行一些小的更改。掌握了簡單的調整后,您將學到更強大的功能,可以為不同的用戶提供不同的內容集。

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

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

您剛剛下載的應用是由PlanetTour Apps,Inc.開發的,事情進展順利,直到有一天,市場營銷人員Greg決定PlanetTour應該改用綠色方案來慶祝Earth Day

這很容易解決-如果您查看AppConstants.swift,可以更改appPrimaryColor屬性,這會影響許多文本標簽的顏色。向用戶推送此更改將涉及發布新版本,將其提交到App Store,獲得批準,然后希望所有用戶在地球日之前下載它。地球日結束后,您必須再次執行整個過程以還原更改。

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


Installing the Remote Config Library

要開始使用Remote Config而不是AppConstants中當前使用的硬編碼值,您需要在Firebase Console中創建一個項目,將其與PlanetTour應用程序關聯,然后安裝Firebase Remote Config庫。

1. Creating a Project in Firebase Console

第一步是創建一個項目。去做這個:

  • 4) 接下來,請確保已選中Enable Google Analytics for this project,然后單擊Continue
  • 5) 接下來,選擇一個現有的Google Analytics(分析)帳戶或創建一個帳戶,然后單擊Create project

您已經創建了項目! 現在,您必須將其與PlanetTour應用程序關聯。

2. Associating the Project with the PlanetTour App

創建項目后,您將被重定向到應用程序的主頁。 要將項目與應用程序連接:

  • 1) 通過單擊iOS logo徽標添加iOS應用:
  • 2) 添加項目的bundle ID(即com.raywenderlich.PlanetTour)和應用程序昵稱(PlanetTour),但將App Store ID字段保留為空白,然后單擊Register App
  • 3) 單擊下載按鈕以下載GoogleServices-info.plist文件:
  • 4) 此時,您的瀏覽器將為您下載GoogleServices-info.plist文件。 將此文件拖到您的Xcode項目中,如上Firebase說明中的屏幕截圖所示。 如果需要,請確保選擇Copy Items if Needed
  • 5) 在安裝向導的其余幾個步驟中,單擊Next。 不用擔心:接下來,您將逐步完成這些說明。 通過單擊Continue to Console完成向導:
  • 6) 切換回Xcode并關閉PlanetTour項目。

您現在快到了! 但是您仍然必須安裝Remote Config Library

3. Installing the Firebase Remote Config Library

您需要啟用您的應用程序才能在互聯網上找到新的價值。 去做這個:

  • 1) 打開終端窗口,然后導航到您的項目。 最簡單的方法是鍵入cd末尾帶有空格),然后等待提交命令。 然后打開Finder窗口并找到包含Xcode項目的文件夾。 將文件夾從Finder拖放到Terminal中。 文件夾的位置將被填充到Terminal中的命令中。 在終端中按鍵盤上的Return鍵以提交命令。
  • 2) 鍵入pod init,然后按Return鍵在項目文件夾中創建一個基本Podfile
  • 3) 使用您喜歡的文本編輯器打開Podfile,并將其內容替換為以下內容,然后保存:
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) 使用項目導航器打開AppDelegate.swift。 在下面的導入UIKit中添加以下內容:
import Firebase

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

FirebaseApp.configure()

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

再次構建并運行您的應用程序。 該應用程序的外觀應與以前相同,只是您會在控制臺輸出中看到以前沒有看到的調試信息。

恭喜你! 您已經安裝了Remote Config! 現在,您可以在本教程的其余部分中使用它。


How Remote Config Works

過于簡化,Remote Config的工作原理類似于云中的[String:Any?]字典。 當您的應用啟動時,它會從云中獲取可能需要的所有新值,然后將其應用到您可能已指定為默認值的所有舊值之上。

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

  • 1) 為Remote Config提供默認值,以備將來更改。
  • 2) 從云中獲取任何新值。 您可以在設備上以緩存的保留模式找到它們。
  • 3) “激活”那些獲取的值。 發生這種情況時,它會將這些獲取的值應用到您現有的默認值之上。
  • 4) 查詢Remote Config的值。 如果找到,Remote Config將為您提供來自云的值,或者基于所提供密鑰的默認值。

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

足夠的理論。 是時候將其付諸實踐了!


Using Remote Config

首先,在Xcode的Project導航器中選擇Utilities文件夾。 右鍵單擊以創建一個新文件。 選擇Swift文件。 將其命名為RCValues.swift并在Xcode建議的默認文件夾中創建它。

將以下內容添加到文件末尾:

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()內部,您將一組鍵和值作為默認值傳遞給Remote Config。 目前,您只提供一個值,但不用擔心,以后會添加更多。

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個小時。 客戶端節流閥可確保您不會頻繁ping通該服務。 在生產應用中,這可能很好。 但是,當您進行開發時–或在線閱讀Firebase Remote Config教程時–這會使測試新值變得非常困難。 因此,您指定的minimumFetchInterval0,以確保您永遠不會使用緩存的數據。

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

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!")
    }
  }
}

這是該代碼中發生的事情:

  • 1) 通過啟用調試模式,您可以告訴Remote Config繞過客戶端的限制。出于開發目的或與10人團隊進行測試,這很好。但是,如果您與數百萬名支持者一起向公眾發布此應用,那么您將很快達到服務器端的要求,并且Remote Config將停止工作。這就是您首先使用客戶端節流閥的全部原因。在真正啟動該應用之前,請確保禁用調試模式,并將minimumFetchInterval設置為更合理的值,例如43200,這對您和我來說都是12個小時。
  • 2) 如果在獲取過程中Remote Config遇到錯誤,它將在應用獲取的值之前退出。不要擔心weak self的警告。您將在本教程的后面部分添加代碼以解決警告。
  • 3) 如果從云端成功下載了值,則Remote Config將使用新值,而不是應用程序中硬編碼的默認值。

將以下內容添加到init()的末尾以調用新方法:

fetchCloudValues()

2. Running Your Code

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

_ = RCValues.sharedInstance

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

構建并運行您的應用程序,您將在調試控制臺中看到以下行:

Retrieved values from the cloud!

Using Remote Config Values

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

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

上面的代碼將為您的appPrimaryColor鍵獲取適當的值。

構建并運行您的應用程序。 您應該看到這樣的一行:

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

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

Remote Config將值檢索為RemoteConfigValue對象。 您可以將它們視為基礎數據的包裝,這些數據在內部以UTF8編碼的字符串表示。 您幾乎永遠不會直接使用此對象。 相反,您將調用諸如numberValueboolValue之類的幫助器方法來檢索所需的實際值。

將您剛添加的行替換為:

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

構建并運行您的應用程序。 這次您會看到:

Our app's primary color is #FBB03B

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

1. Updating Values From the Cloud

現在您已從Remote Config獲取了正確的值,請嘗試從云中提供新的值。

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

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

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

構建并運行您的應用程序。

現在查看控制臺中的內容:

Our app's primary color is #36C278

您正在從云中更新價值!


Changing Your App’s Look and Feel

現在,該掛斷您的應用程序以使用此新值了。

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

打開RCValues.swift并在類定義上方添加以下內容:

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值更改應用程序中的位置,以改用此新的RCValues幫助器方法。

在三個位置執行此操作:

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

為下面

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

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

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

要徹底,請打開AppConstants.swift并刪除以下內容:

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

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

現在,構建并運行您的應用程序。 您應該在整個應用程序中看到新的綠色:

1. Addressing the Timing of New Values

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

這會使您的用戶感到困惑。 在這種情況下,您只需要更改一些標簽顏色,但是如果您的應用在用戶運行時更改了影響其行為的文本或值,則可能會造成困惑。

您可以通過多種方式處理此問題,但最簡單的方法可能是創建加載屏幕。 在本教程中,已經為您進行了部分設置。


Hooking Up a Loading Screen

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

現在,添加邏輯,以在Remote Config完成加載后過渡到主菜單。

打開RCValues.swift,在sharedInstance屬性下面添加以下內容:

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

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

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

在這里,將fetchComplete設置為true,表示獲取已完成。 最后,您調用可選的回調,以通知偵聽器Remote Config值已完成加載。 您可以使用此命令告訴加載屏幕自行關閉。

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

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

接下來,將viewDidLoad()替換為以下內容:

override func viewDidLoad() {
  super.viewDidLoad()

  if RCValues.sharedInstance.fetchComplete {
    startAppForReal()
  }

  RCValues.sharedInstance.loadingDoneCallback = startAppForReal
}

在這里,您要使startAppForReal()在所有值完成加載后由RCValues方法調用。 您還添加了一張check,以防RCValues在等待屏幕完成加載之前設法完成網絡通話。 這永遠都不會發生,但是防御性地編寫代碼也不會造成傷害!

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

構建并運行。 您會看到等待屏幕一會兒,具體取決于您的網絡速度,然后跳入應用程序的其余部分。 如果您在Firebase控制臺中更改應用原色的值并重新啟動應用,則新顏色將正確顯示在應用中的任何位置。 請記住在Firebase控制臺中單擊Publish Changes


Hook Up the Rest of Your App

現在,您已經將一個值從AppConstants轉換為RCValues,現在可以轉換其余的值了! 在本部分中,您將在幕后看到如何連接應用程序。 您還將看到如何組織Remote Config的支持代碼,以后可以將其應用于自己的應用。

打開RCValues.swift并將ValueKey替換為以下內容:

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()替換為以下內容:

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的應用程序的每個部分替換為對RCValues的相應調用。

您將在整個應用程序中進行九項更改:

  • 1) 打開ContainerViewController.swift并將updateNavigationColors()替換為以下內容:
func updateNavigationColors() {
  navigationController?.navigationBar.tintColor = RCValues.sharedInstance
    .color(forKey: .navTintColor)
}
  • 2) 將updateBanner()替換為以下內容:
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()替換為以下內容:
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()內部,替換以下行:
scaleFactors.append(pow(ratio, AppConstants.planetImageScaleFactor))

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

這是很多更改,但是現在您應該切換整個應用程序。 要完成重構,請在您的應用程序中搜索AppConstants —— 您只剩下一個結果,該結果定義了結構體本身:

確實可以使用Project導航器找到AppConstants.swift文件,選擇并刪除它。 構建并運行。 如果重構成功,則不會看到任何錯誤。

現在,您的應用已完全連接到Remote Config,您可以進行其他更改,除了Greg非常喜歡的綠色之外。

1. Adding Further Changes to Your App

打開Firebase Console。 確保您位于Remote Config部分,然后單擊Add Parameter。 鍵入navBarBackground作為鍵,并輸入#35AEB1作為新值,然后單擊Add Parameter。 然后執行相同的操作,將navTintColor設置為#FFFFFF。 單擊Publish Changes,然后在模式框中確認以將這些更改發布到您的應用程序。

完成后,您的控制臺應如下所示:

切換回Xcode,然后構建并運行。

輕按一個行星,您的應用程序應如下所示:

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

但是,當您完成后,請返回本教程,因為您要處理國際危機!


Bringing Back Pluto

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

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

1. Conditions to the Rescue!

Remote Config能夠將不同的數據集提供給不同的用戶,這使其不僅比云中的簡單字典還復雜。 利用此功能,讓斯堪的納維亞用戶再次將冥王星變成一顆行星。

首先,打開Firebase Console,確保您位于Remote Config面板中,然后單擊Add Parameter以添加新參數。

輸入shouldWeIncludePluto作為參數鍵。

接下來,單擊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以將這些更改推向世界。

構建并運行以查看結果。

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

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

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

構建并運行您的應用程序。 這次,您應該看到冥王星回到它所屬的星球,以及其他行星。 避免了國際危機!

Welcome back, Pluto. We missed you!

另一種無需擺弄模擬器設置的測試方法是,用Option鍵單擊Xcode中的Run按鈕。 在出現的對話框中,單擊Options窗格,然后在App Language菜單中選擇適當的語言。

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

現在您已經有了基礎,使用Remote Config可以做更多的事情。如果您正在開發任何類型的游戲,如果玩家發現游戲太容易或太難,它都是調整游戲玩法的好方法。這也是創建“Message of the Day”功能的一種簡便方法。或者,您可以僅使用它來嘗試其他按鈕或標簽文本,以查看您的用戶的最佳反應。在您喜歡的應用程序中嘗試一下,看看您可以即時更改什么!

后記

本篇主要講述了Firebase Remote Config教程,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內容