Как настроить Firebase на IOS с контроллера представления (не AppDelegate)? - PullRequest
0 голосов
/ 20 сентября 2018

Среда

  • Версия 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 не инициализироваться с контроллера при действиях пользователя?Как правильно достичь этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...