2
votes

In an iOS project, we decided to turn on a feature as a demo purposing scenario to only some white listed users to implement this, after user logs in to the app in LoginController we send user id to Firebase by using this Analytics.setUserProperty(id, forName: "ID") and we have setup a remote config flag with multiple conditions which each condition is checking a particular user id if that's equal with the user id sending after login process to Firebase, it returns true otherwise false. Exactly after we send user id in LoginController we try to fetch the remote config flag

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

and here is the RCUtility class

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
    }
}

the problem is as long as I test it in debug mode which time interval is 0 it works properly when for example I login as a whitelisted user I see that specific feature and when I logout and login as another none whitelisted users I won't see the feature but when we publish the app for QAs this isn't happening if they login as a good user firstly they see the feature but if they logout and login again as a bad user they can still see the feature which they suppose not! unless they wait for 1 hr (the specified time interval to fetch a new value for the flag) or if they delete the app and re-install it and login again! It seems FB doesn't return updated value if these two conditions aren't met.

I am sure the flag has been setup in Firebase correctly.

I have tried different ways such as activating the flag after fetching from FB or try to reset the value from UserDefaults after user logs out of the app or save the value in a constant instead of using UserDefaults but none of them worked I am not sure is it the way FB works with remote config flag or I am missing anything?

The Android version doesn't have this issue with same implementation and same time interval and regardless of the debug or production mode or type of user they get the correct value each time from Firebase without having to delete and reinstall the app.

2
try decreasing duration : let fetchDuration: TimeInterval = 10. - Niraj

2 Answers

2
votes

Remote Config's fetch mechanism probably doesn't know anything about the user, which means that it simple waits until the cache expires, which defaults to 12 hours. Also see the Firebase documentation on caching.

I'm inclined to consider this a bug, although I'm not sure if it's working as intended. Either way, it might be worth it to file a bug report.

As a workaround, you could tell fetch to request new values after you detect a fresh login by calling fetchWithExpirationDuration:completionHandler: with a very low expiration duration. Just be sure to only call this variant after a new user signs in, as too frequent calls may result in a server-side throttle being applied.

0
votes

I've done some tests and I believe it's a Firebase Bug. In the first request I get the old result, and after two requests I got the update.