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的主要内容,如果未能解决你的问题,请参考以下文章