【问题标题】:Why Firebase doesn't send an updated value for remote config flag until its time interval has been passed in an iOS project?为什么在 iOS 项目中通过时间间隔之前,Firebase 不会发送远程配置标志的更新值?
【发布时间】:2019-08-25 06:42:31
【问题描述】:

在一个 iOS 项目中,我们决定只为一些白名单用户打开一个功能作为演示目的场景来实现这一点,在用户登录到 LoginController 中的应用程序后,我们使用此功能将用户 ID 发送到 Firebase Analytics.setUserProperty(id, forName: "ID") 我们已经设置了一个带有多个条件的远程配置标志,每个条件都检查一个特定的用户 ID,如果它与登录过程后发送到 Firebase 的用户 ID 相同,则返回 true,否则返回 false。 就在我们在 LoginController 中发送用户 ID 之后,我们尝试获取远程配置标志

RCUtility.fetchAVFlagValue { result in
                    UserDefaults.standard.set(result, forKey: DefaultKeys.remoteConfigFlag)
                }

这里是RCUtility 类

class RCUtility {

    static func fetchAVFlagValue(completion: @escaping (_ flag: Bool) -> Void) {
        #if DEBUG
        let fetchDuration: TimeInterval = 0
        activateDebugMode()
        #else
        let fetchDuration: TimeInterval = 3600
        #endif
        let remoteConfig = RemoteConfig.remoteConfig()
        remoteConfig.fetch(withExpirationDuration: fetchDuration) { _, error in
            if let error = error {
                print("Error fetching remote values: \(error)")
                return
            }

            remoteConfig.activateFetched()
            completion(remoteConfig
                .configValue(forKey: "auto_vision_flag")
                .boolValue)
        }
    }

    static func activateDebugMode() {
        let debugSettings = RemoteConfigSettings(developerModeEnabled: true)
        RemoteConfig.remoteConfig().configSettings = debugSettings
    }
}

问题是只要我在调试模式下对其进行测试,时间间隔为0 它可以正常工作,例如当我以白名单用户身份登录时,我看到了该特定功能,当我注销并以另一个非白名单用户身份登录时我不会看到该功能,但是当我们为 QA 发布应用程序时,如果他们首先以良好用户身份登录,他们会看到该功能,但如果他们以不良用户身份注销并再次登录,他们仍然可以看到该功能他们认为不是!除非他们等待 1 小时(为标志获取新值的指定时间间隔),或者如果他们删除应用程序并重新安装并再次登录!如果不满足这两个条件,FB 似乎不会返回更新的值。

我确信该标志已在 Firebase 中正确设置。

我尝试了不同的方法,例如在从 FB 获取后激活标志,或者尝试在用户退出应用程序后从 UserDefaults 重置值,或者将值保存在常量中而不是使用 UserDefaults,但它们都不起作用不确定FB使用远程配置标志的方式还是我遗漏了什么?

Android 版本不存在此问题,具有相同的实现和相同的时间间隔,并且无论调试或生产模式或用户类型如何,它们每次都从 Firebase 获得正确的值,而无需删除并重新安装应用程序。

【问题讨论】:

  • 尝试减少持续时间:let fetchDuration: TimeInterval = 10.

标签: swift firebase firebase-remote-config


【解决方案1】:

Remote Config 的 fetch 机制可能对用户一无所知,这意味着它简单地等待直到缓存过期,默认为 12 小时。另请参阅Firebase documentation on caching。

我倾向于认为这是一个错误,尽管我不确定它是否按预期工作。不管怎样,file a bug report 可能是值得的。

作为一种解决方法,您可以在检测到新登录后告诉 fetch 请求新值,方法是调用具有非常短的过期持续时间的 fetchWithExpirationDuration:completionHandler:。请务必仅在新用户登录后调用此变体,因为过于频繁的调用可能会导致应用服务器端限制。

【讨论】:

  • Firebase 不应该了解用户吗?因为我们将分析用户 ID 发送到平台,然后我们使用它作为条件来检查此用户 ID 是否等于 1234 或不发送标志的 true 或 false - 以及目前我们建议的解决方法'在登录过程中获取值,因此这意味着它期望在每次新登录后获取值
  • 您需要在新用户登录后以非常低的超时时间调用 fetch,以确保刷新。
【解决方案2】:

我进行了一些测试,我认为这是 Firebase 错误。在第一个请求中,我得到了旧的结果,在两次请求之后,我得到了更新。

【讨论】:

  • 好吧,在我的情况下,第一个请求发送了一个正确的值,但时间间隔内的任何其他请求都没有获得更新的值,这可能是其 iOS API 上的一个 FB 错误,因为 Android Remote Config API 有效正确!
猜你喜欢
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多