Сбой удаленной конфигурации Firebase (objective c iOS)

#ios #objective-c #firebase #firebase-remote-config

#iOS #objective-c #firebase #firebase-remote-config

Вопрос:

У меня возникли проблемы с извлечением информации из Firebase RemoteConfig. При установке приложения у меня есть экран выбора языка перед контроллером представления MainController. На контроллере представления MainController я выполняю выборку RemoteConfig. Это работает в первый раз, когда экран выбора языка отображается перед контроллером представления MainController. Но, начиная со следующего раза, он выходит из строя в этой конкретной строке:

 [self.remoteConfig fetchWithExpirationDuration:expirationDuration completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
  

За следующим исключением:

     *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString firstObject]: unrecognized selector sent to instance 0xa0000000000616a2'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010d20134b __exceptionPreprocess   171
    1   libobjc.A.dylib                     0x000000010cc6221e objc_exception_throw   48
    2   CoreFoundation                      0x000000010d270f34 -[NSObject(NSObject) doesNotRecognizeSelector:]   132
    3   CoreFoundation                      0x000000010d186c15 ___forwarding___   1013
    4   CoreFoundation                      0x000000010d186798 _CF_forwarding_prep_0   120
    5   English                             0x0000000107f44e1b -[GIPLocale googleLanguageWithAppleLanguages:]   33
    6   English                             0x0000000107f45396 -[GIPLocale recalculateLocale]   54
    7   English                             0x0000000107f44c26 -[GIPLocale initWithLanguageMappings:]   99
    8   English                             0x0000000107f44b77 __25 [GIPLocale googleLocale]_block_invoke   41
    9   libdispatch.dylib                   0x000000010da900cd _dispatch_client_callout   8
    10  libdispatch.dylib                   0x000000010da751fc dispatch_once_f   501
    11  English                             0x0000000107f44b4c  [GIPLocale googleLocale]   42
    12  English                             0x0000000107f42d06  [RCNDevice deviceLocale]   31
    13  English                             0x0000000107f43344  [RCNDevice hasDeviceContextChanged:projectIdentifier:]   325
    14  English                             0x0000000107f3e133 -[RCNConfigFetch fetchAllConfigsWithExpirationDuration:completionHandler:]   150
    15  English                             0x0000000107f3577f -[FIRRemoteConfig fetchWithExpirationDuration:completionHandler:]   77
  

ОБНОВЛЕНИЕ: не имеет значения, показываю ли я экран выбора языка или нет. Он всегда работает при новой установке и перестает работать при следующих запусках.

Это мой полный код, который я использую.

 -(void)viewDidAppear:(BOOL)animated{
    //Display select language settings
    if (![[NSUserDefaults standardUserDefaults] boolForKey:DISPLAY_LANGUAGE_SETTING])
    {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults  setBool:TRUE forKey:DISPLAY_LANGUAGE_SETTING];
        [defaults synchronize];
        //Display Language Screen
        AGSelectLanguageViewController *languageViewController =  [self.storyboard instantiateViewControllerWithIdentifier:@"AGSelectLanguageViewController"];
        self.modalPresentationStyle = UIModalPresentationFullScreen;
        [self presentViewController:languageViewController animated:NO completion:nil];
    }

  [self configFireBase];

}
  -(void)configFireBase{
        // Firebase Configuration
        self.remoteConfig = [FIRRemoteConfig remoteConfig];
       //Enabling development mode
        FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] initWithDeveloperModeEnabled:YES];
        self.remoteConfig.configSettings = remoteConfigSettings;

        //Set default Remote Config values
        [self.remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

        [self fetchConfig];
    }

- (void)fetchConfig {
    _discount_percentage = self.remoteConfig[DISCOUNT_PERCENTAGE].numberValue.floatValue;

    long expirationDuration = 3600;

    if (self.remoteConfig.configSettings.isDeveloperModeEnabled) {
        expirationDuration = 0;
    }


    [self.remoteConfig fetchWithExpirationDuration:expirationDuration completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
        if (status == FIRRemoteConfigFetchStatusSuccess) {
            NSLog(@"Config fetched!");
            [self.remoteConfig activateFetched];
        } else {
            NSLog(@"Config not fetched");
            NSLog(@"Error %@", error.localizedDescription);
        }
    }];
}
  

Где я ошибаюсь? Пожалуйста, помогите.

Ответ №1:

Класс GIPLocale выполняет некоторое сопоставление между именами Google и Apple для локалей, и как часть этого он извлекает локали приложения из NSUserDefaults:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
  

Я предполагаю, что где-то для записи по умолчанию устанавливается значение просто string или аналогичное, а не массив — проверьте, ссылаетесь ли вы на эту строку где-нибудь в своем приложении.

Комментарии:

1. Большое спасибо 🙂 Я вставлял это значение в AppleLanguages — [defaults setObject:[localeList objectForKey:languageChoosen] forKey:@»AppleLanguages»]; что вызывало все проблемы.