使用firebase和Objective C

时间:2016-08-30 12:14:12

标签: ios objective-c firebase apple-push-notifications firebase-cloud-messaging

我正在尝试使用Firebase进行推送通知。我已通过Firebase成功安装了Firebase messagingCocoapods

我使用了以下代码

 - (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)。当应用程序处于前台(活动)时,日志显示以下消息

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)。我的手机未在通知中心中显示任何通知,无论应用是在前台,背景还是已关闭

我希望用户在App处于后台,前台或已关闭时接收推送通知

3 个答案:

答案 0 :(得分:1)

您必须致电[[UIApplication sharedApplication] registerForRemoteNotifications];以正确注册远程通知。

配置远程通知以供后台使用

您是否配置了应用的后台模式以接受远程通知? 您可以点击以下操作:项目名称 - > 功能 - > 背景模式

启用此选项,然后勾选远程通知旁边的框,如下面的屏幕截图所示。

enter image description here

答案 1 :(得分:0)

您应该致电(iOS 8+)registerForRemoteNotifications,而不是isRegisteredForRemoteNotifications

否则,您永远不会从使用APNS本地提供的Firebase服务器获得“高优先级”消息。

请注意,当您在XCode中运行时,您正在以沙盒模式运行,因此请务必使用正确的参数进行注册。

尝试以“高优先级”发送它并查看您的有效负载是否采用正确的APNS格式:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
}

请注意,您的有效负载可能有=而不是:,这是可以接受的。

答案 2 :(得分:0)

您需要在开发人员帐户中创建一个启用了推送通知权利的应用ID。幸运的是,Xcode有一个简单的方法来做到这一点。转到应用设置 - >功能并将推送通知的开关翻转为开。 加载一段时间后,它应如下所示: 推送通知enter image description here

同时检查为Firebase设置的p12证书,因为它使用.p12证书进行推送通知。