Среда
- Версия Xcode: 9.4.1
- Версия SDK Firebase: 5
- Компонент Firebase: Обмен сообщениями
Проблема
Я пытаюсь интегрировать обмен сообщениями Firebase в IOS.Моя цель - обрабатывать сообщения с данными, когда приложение находится на переднем и заднем плане.
В основном отсюда https://firebase.google.com/docs/cloud-messaging/ios/client и некоторые другие.
У меня есть три основных метода:который устанавливает Firebase.Моими двумя основными требованиями являются обработка изменений токенов и обработка сообщений с данными.
- (void)initFirebase{
[FIRApp configure];
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
printf("\n#B initFirebase.IOS 9");
UIUserNotificationType allNotificationTypes =
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings =
[UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
// iOS 10 or later
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
printf("\n#B initFirebase.IOS 10+");
UNAuthorizationOptions authOptions =
UNAuthorizationOptionAlert
| UNAuthorizationOptionSound
| UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
// For iOS 10 display notification (sent via APNS)
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
// For iOS 10 data message (sent via FCM)
[FIRMessaging messaging].delegate = self;
#endif
}
[[UIApplication sharedApplication] registerForRemoteNotifications];
// NSLog(@"#B initFirebase.fir token is %@",[[FIRInstanceID instanceID] token]);
printf("\n#B initFirebase. token: %s", [[[FIRInstanceID instanceID] token] UTF8String]);//token is null here
}
// [START refresh_token]
//called everytime token changes. must register
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
printf("\n#B didReceiveRegistrationToken. token: %s", [fcmToken UTF8String]);
//NSLog(@"FCM registration token: %@", fcmToken);
// Notify about received token.
NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
[[NSNotificationCenter defaultCenter] postNotificationName:
@"FCMToken" object:nil userInfo:dataDict];
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new token is generated.
}
// [END refresh_token]
//called everytime a message is received. must call custom message handler
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{
printf("\n#B application didReceiveRemoteNotification message:");
//NSLog(@"#B received notification");
//handle the notification here
}
Когда вызывается initFirebase из AppDelegate.m 'didFinishLaunchingWithOptions', он отлично работает.Токен установлен.Сообщения принимаются.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self initFirebase];
return YES;
}
Однако мое требование заключается в настройке Firebase только тогда, когда пользователь выбирает параметр из настроек.
Когда я вызываю код 'initFirebase' после нажатия кнопки, вызывается только 'didReceiveRegistrationToken'.
Сообщения вообще не принимаются.'didReceiveRemoteNotification' никогда не вызывается.
Может ли Firebase не инициализироваться с контроллера при действиях пользователя?Как правильно достичь этого?