NSInvalidArgumentException FIRMessaging connectWithCompletion - PullRequest
0 голосов
/ 23 января 2020

Создан проект на Firebase для iOS, Успешно установлены модули, Добавлен GoogleService-info.plist,
Включено уведомление pu sh, Добавлен ключ авторизации для Firebase, Добавлен $ (унаследован) к Other C Flags вместе с PODS ROOTS, добавленными правами с APS Environment и группами доступа к цепочке для ключей,

Добавлена ​​следующая реализация для делегата:

#import <Firebase/Firebase.h>
#import <FirebaseInstanceID/FirebaseInstanceID.h>
#import <FirebaseMessaging/FirebaseMessaging.h>

@implementation AppDelegate

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v     options:NSNumericSearch] == NSOrderedAscending)
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
#endif

// Copied from Apple's header in case it is missing in some cases (e.g. pre-Xcode 8 builds).
#ifndef NSFoundationVersionNumber_iOS_9_x_Max
#define NSFoundationVersionNumber_iOS_9_x_Max 1299
#endif

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    application.applicationIconBadgeNumber = 0;


    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        // iOS 7.1 or earlier. Disable the deprecation warnings.
        #pragma clang diagnostic push
        #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        UIRemoteNotificationType allNotificationTypes =
        (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge);
        [application registerForRemoteNotificationTypes:allNotificationTypes];
        #pragma clang diagnostic pop
    }
    else 
    {
        // iOS 8 or later
        if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
            UIUserNotificationType allNotificationTypes =
            (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
            UIUserNotificationSettings *settings =
            [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
            [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        } 
        else {
            // iOS 10 or later
            #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
            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] setDelegate:self];               
            [[UIApplication sharedApplication] registerForRemoteNotifications];
            #endif
        }
     }

    [FIRApp configure];
    // Add observer for InstanceID token refresh callback.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshNotification:)
                                             name:kFIRInstanceIDTokenRefreshNotification object:nil];
    [self removeScreen];
    [window makeKeyAndVisible];
    return YES;
}

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [[FIRMessaging messaging] setAPNSToken: deviceToken type: FIRMessagingAPNSTokenTypeProd];

    NSString *tokenString = [deviceToken description];
    tokenString = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];

    tokenId = [tokenString stringByReplacingOccurrencesOfString:@" " withString:@""];
    self.devToken = tokenId;

    [self connectToFcm];
}

- (void)tokenRefreshNotification:(NSNotification *)notification {
    [self connectToFcm];
}

- (void)connectToFcm {
    [[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
        if (error != nil) {
            NSLog(@"Unable to connect to FCM. %@", error);
        } else {
            NSLog(@"Connected to FCM.");
        }
    }];
} 

Когда я запускаю код, я получаю следующее ошибка:

Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', reason: '-[FIRMessaging connectWithCompletion:]: unrecognized selector sent to instance 0x280bc0c00'

Знаете ли вы, что может быть причиной ошибки и как ее исправить?

Ответы [ 2 ]

1 голос
/ 23 января 2020

В соответствии с предоставленным @Eysner: https://firebase.google.com/docs/cloud-messaging/ios/client

Я заменил следующий код:

 - (void)connectToFcm {
    [[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
        if (error != nil) {
            NSLog(@"Unable to connect to FCM. %@", error);
        } else {
            NSLog(@"Connected to FCM.");
        }
    }];
} 

на следующий код:

- (void)connectToFcm {
    [[FIRInstanceID instanceID] instanceIDWithHandler:^(FIRInstanceIDResult * _Nullable result, NSError * _Nullable error{
          if (error != nil) {
                NSLog(@"Error fetching remote instance ID: %@", error);
          }
          else {
                NSLog(@"Remote instance ID token: %@", result.token);
                NSString* message = [NSString stringWithFormat:@"Remote InstanceID token: %@", result.token];
          }
    }];
}
1 голос
/ 23 января 2020

Если я правильно понимаю, у вас проблема с конфигурацией FIRMessaging.
Я не увидел какой-то код, который нам нужен, например - делегат установки

[FIRMessaging messaging].delegate = self;

Так что я думаю, что вам нужно просто используйте руководство шаг за шагом.
Надеюсь, оно вам пригодится
https://firebase.google.com/docs/cloud-messaging/ios/client

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