Аудитория Firebase на основе свойств пользователя

Мне нужно протестировать некоторые функции моего приложения только с предварительно выбранной группой пользователей.

Я создал аудиторию, в которой user_id exactly matches 123456. 123456 - это мой собственный идентификатор.

В Remote Config я создал условие, которое соответствует пользователям из указанной выше аудитории.

Затем я создал в Remote Config параметр с именем feature_available и для условия установил возвращаемое значение true. Значение по умолчанию - false.

В своем приложении я настроил Firebase:

    FIRApp.configure()

    let remoteConfig = FIRRemoteConfig.remoteConfig()
    if let remoteConfigSettings = FIRRemoteConfigSettings(developerModeEnabled: false) {
        remoteConfig.configSettings = remoteConfigSettings
    }
    remoteConfig.setDefaultsFromPlistFileName("FirebaseRemoteConfigDefaults")

И установите ID пользователя:

    FIRAnalytics.setUserID("123456")

Затем я беру из Firebase:

    var expirationDuration: Double
    // If in developer mode cacheExpiration is set to 0 so each fetch will retrieve values from the server.
    expirationDuration = remoteConfig.configSettings.isDeveloperModeEnabled ? 0 : 3600

    remoteConfig.fetch(withExpirationDuration: TimeInterval(expirationDuration)) { (status, error) -> Void in
        if status == .success {
            remoteConfig.activateFetched()
        } else {
            assertionFailure("Firebase config not fetched. Error \(error!.localizedDescription)")
        }
    }

Последнее, что я делаю, это получаю значение из Firebase и проверяю, включена ли у меня функция:

    let featureIsAvailable = remoteConfig["feature_available"].boolValue
    if featureIsAvailable { ... }

Проблема в том, что каждый раз, когда значение возвращается из Firebase, оно равно false, и я не могу заставить его вернуть правильное значение, которое соответствует той аудитории, которую я создал. Я также попытался сделать это, установив свойство пользователя вместо использования setUserID(), и получил тот же результат. Какие-либо предложения?


person Tchelow    schedule 29.11.2016    source источник


Ответы (2)


Раньше я сталкивался с подобными проблемами, иногда для завершения выборки может потребоваться некоторое время. Проверить, доступна ли функция, необходимо после успешного исправления конфигурации. Что-то вроде этого, надеюсь, сработает и для вас:

var featureIsAvailable : Bool?

override func viewDidLoad() {
    super.viewDidLoad()

    configureRemoteConfig()
    fetchConfig()      
}

func configureRemoteConfig() {
    remoteConfig = FIRRemoteConfig.remoteConfig()
    // Create Remote Config Setting to enable developer mode.
    // Fetching configs from the server is normally limited to 5 requests per hour.
    // Enabling developer mode allows many more requests to be made per hour, so developers
    // can test different config values during development.
    let remoteConfigSettings = FIRRemoteConfigSettings(developerModeEnabled: true)
    remoteConfig.configSettings = remoteConfigSettings!
    remoteConfig.setDefaultsFromPlistFileName("RemoteConfigDefaults")
}

func fetchConfig() {
    var expirationDuration: Double = 3600
    // If in developer mode cacheExpiration is set to 0 so each fetch will retrieve values from
    // the server.
    if (self.remoteConfig.configSettings.isDeveloperModeEnabled) {
        expirationDuration = 0
    }

    // cacheExpirationSeconds is set to cacheExpiration here, indicating that any previously
    // fetched and cached config would be considered expired because it would have been fetched
    // more than cacheExpiration seconds ago. Thus the next fetch would go to the server unless
    // throttling is in progress. The default expiration duration is 43200 (12 hours).
    remoteConfig.fetch(withExpirationDuration: expirationDuration) { (status, error) in
        if (status == .success) {
            print("Config fetched!")
            self.remoteConfig.activateFetched()

            let featureIsAvailable = self.remoteConfig["feature_available"]

            if (featureIsAvailable.source != .static) {
                self.featureIsAvailable = featureIsAvailable.boolValue
                print("should the feature be available?", featureIsAvailable!)
            }
        } else {
            print("Config not fetched")
            print("Error \(error)")
        }
        self.checkIfFeatureIsAvailable()
    }
}

func checkIfFeatureIsAvailable() {
    if featureIsAvailable == false {
        // Don't show new feature
    } else {
        // Show new feature
    }
}
person Jordi Bruin    schedule 30.11.2016
comment
Спасибо, Джорди, но в основном я этим и занимаюсь. Когда моя выборка завершается успешно, все значения, которые должны быть получены как true, равны false. TBH, я не верю, что это что-то с моим кодом, но что-то с Firebase, которое возвращает неправильное значение для аудитории. - person Tchelow; 01.12.2016
comment
@Tchelow, должно быть, я неправильно прочитал их вопрос, мое плохое! - person Jordi Bruin; 01.12.2016

Я отправил электронное письмо команде Firebase с просьбой о поддержке, и они сказали мне, что проблема связана с ошибкой в ​​Xcode 8 (.0 и .1) с использованием Swift. Обновление до последней версии, выпущенной сегодня, 8.2, устранило проблему.

person Tchelow    schedule 13.12.2016