#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»]; что вызывало все проблемы.