未使用 firebase 和 Objective C 接收推送通知
Posted
技术标签:
【中文标题】未使用 firebase 和 Objective C 接收推送通知【英文标题】:Not receiving Push Notifications Using firebase and Objective C 【发布时间】:2016-08-30 12:14:11 【问题描述】:我正在尝试使用Firebase
进行推送通知。我已经通过Cocoapods
成功安装了Firebase
和Firebase messaging
。
我使用了下面的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[FIRApp configure];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshCallback:) name:kFIRInstanceIDTokenRefreshNotification object:nil];
UIUserNotificationType allNotificationsType = (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:allNotificationsType categories:nil];
[application registerUserNotificationSettings:settings];
[application isRegisteredForRemoteNotifications];
return YES;
-(void)applicationDidEnterBackground:(UIApplication *)application
[[FIRMessaging messaging] disconnect];
NSLog(@"Disconnect from FCM");
- (void)applicationDidBecomeActive:(UIApplication *)application
[self connectToFirebase];
- (void) application:(UIApplication *) application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:( void (^)(UIBackgroundFetchResult))completionHandler
// Pring The Message Id
NSLog(@"Mesage Id : %@",userInfo[@"gcm.message_id"]);
// Print Full Message
NSLog(@"%@",userInfo);
#pragma mark -- Custom Firebase code
- (void)tokenRefreshCallback:(NSNotification *) notification
NSString *refreshedToken = [[FIRInstanceID instanceID] token];
NSLog(@"IstanceID token: %@", refreshedToken);
// Connect To FCM since connection may have failed when attempt before having a token
[self connectToFirebase];
-(void) connectToFirebase
[[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error)
if ( error != nil)
NSLog(@"Unable to Connect To FCM. %@",error);
else
NSLog((@"Connected To FCM"));
];
当我使用与Xcode
连接的 iPhone 运行上述代码时,当我从 Firebase 控制台发送消息时遇到以下问题
1)。当应用程序处于前台(活动状态)时,Log 显示以下消息
Mesage Id : (null)
CustommData = "First Message";
"collapse_key" = "abcd.iospush.FireBasePush";
from = 555551391562;
notification =
badge = 4;
body = "Test Message";
e = 1;
sound = default;
sound2 = default;
;
注意Message Id
是null
。
2)。我的手机在通知中心中没有显示任何通知,无论应用程序处于前台、后台还是关闭状态
我希望用户在应用处于后台、前台或关闭时接收推送通知
【问题讨论】:
您检查过您的 APN 证书吗?您使用来自同一证书的 APN 收到通知? 【参考方案1】:您必须致电[[UIApplication sharedApplication] registerForRemoteNotifications];
才能正确注册远程通知。
为后台使用配置远程通知
您是否已将应用的后台模式配置为接受远程通知? 你可以通过点击:Project Name -> Capabilities -> Background Modes
打开它,然后勾选远程通知旁边的框,如下面的屏幕截图所示。
【讨论】:
“远程通知”后台仅确保如果您的应用在后台,您的应用会在远程通知到达时立即处理它,并且如果您的应用没有运行,则会启动您的应用,而不是必须等待用户点击通知。它要求用户拥有 iOS 7 或更高版本。请注意,本地通知不会在后台处理。 @RhuariGlen i 为后台使用配置远程通知,如您所说并使用 [[UIApplication sharedApplication] registerForRemoteNotifications];以及 t 工作正常,但它显示警告 Application delegate received call to -application:didReceiveRemoteNotification:fetchCompletionHandler: 但从未调用完成处理程序。 @Hya 完成通知中的数据处理后,您必须调用完成处理程序并传入最能描述下载操作结果的UIBackgroundFetchResult
。更多信息请参考apple docs。
@Hya 如果对您有帮助,您能否也将我的回答标记为正确:)【参考方案2】:
您应该拨打 (iOS 8+) registerForRemoteNotifications
,而不是 isRegisteredForRemoteNotifications
。
否则,您将永远无法从 Firebase 服务器获得“高优先级”消息,这些消息是使用 APNS 本地传递的。
请注意,当您在 XCode 中运行时,您是在沙盒模式下运行的,因此请务必使用正确的参数进行注册。
尝试以“高优先级”发送它,看看您的负载是否采用正确的 APNS 格式:
"aps" :
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
,
请注意,您的有效负载可能有=
而不是:
,这是可以接受的。
【讨论】:
我使用了 registerForRemoteNotifications 并且它工作但带有警告警告:应用程序委托接收到调用 -application:didReceiveRemoteNotification:fetchCompletionHandler: 但从未调用完成处理程序。我们该如何解决这个问题 您需要实现didReceiveRemoteNotification:
。当应用在后台收到本机 (APNS) 通知并且用户点击它时,或者当应用在前台收到通知时,就会触发该通知。【参考方案3】:
您需要在您的开发者帐户中创建一个启用了推送通知权利的 App ID。幸运的是,Xcode 有一个简单的方法来做到这一点。转到应用程序设置 -> 功能,然后将推送通知的开关拨到开。 经过一些加载后,它应该如下所示: 推送通知
还要检查是否为 Firebase 设置了 p12 证书,因为它使用 .p12 证书进行推送通知。
【讨论】:
请使用这个方法:[application registerForRemoteNotifications]; [应用程序注册用户通知设置:设置]之后;以上是关于未使用 firebase 和 Objective C 接收推送通知的主要内容,如果未能解决你的问题,请参考以下文章
Firebase:混合 C++ 和 Objective-C SDK 可以吗?
Objective-C - Firebase 从数据库中检索数据并填充到表中
Firebase 突然崩溃并显示“RepoExists”消息