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阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容