NSInvalidArgumentException FIRMessaging connectWithCompletion

Posted

技术标签:

【中文标题】NSInvalidArgumentException FIRMessaging connectWithCompletion【英文标题】: 【发布时间】:2020-01-23 09:27:40 【问题描述】:

在 Firebase for ios 上创建项目, 成功安装了豆荚, 添加了 GoogleService-info.plist, 启用推送通知, 将身份验证密钥添加到 firebase, 将 $(inhertied) 与 PODS ROOTS 一起添加到 Other C Flags, 添加了 APS 环境和钥匙串访问组的权利,

为委托添加了以下实现:

#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'

您知道导致错误的原因以及如何解决吗?

【问题讨论】:

【参考方案1】:

按照@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];
          
    ];

【讨论】:

【参考方案2】:

如果我理解正确,您的配置有问题 FIRMessaging。 我没有看到我们需要的一些代码,例如 - setup delegate

[FIRMessaging messaging].delegate = self;

所以我认为你需要一步一步地使用指南。 希望对你有用https://firebase.google.com/docs/cloud-messaging/ios/client

【讨论】:

感谢您的贡献,恐怕即使添加了这行代码,错误仍然存​​在。

以上是关于NSInvalidArgumentException FIRMessaging connectWithCompletion的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 作为参数传递 swift