未使用 firebase 和 Objective C 接收推送通知

Posted

技术标签:

【中文标题】未使用 firebase 和 Objective C 接收推送通知【英文标题】:Not receiving Push Notifications Using firebase and Objective C 【发布时间】:2016-08-30 12:14:11 【问题描述】:

我正在尝试使用Firebase 进行推送通知。我已经通过Cocoapods成功安装了FirebaseFirebase 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 Idnull

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 可以吗?

firebase objective c查询

Objective-C - Firebase 从数据库中检索数据并填充到表中

Firebase 突然崩溃并显示“RepoExists”消息

如何在 Firestore Objective-c 上设置/更新数据时以秒为单位获取 Firebase 服务器时间?

无法从我的 Objective-C 代码向 Google Analytics/Firebase 发送自定义事件