我无法在后台收到推送通知。 iOS 10 - 对象 - Firebase

时间:2016-10-30 16:51:55

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

我正在尝试在后台收到通知,我按照文档Firebase和Apple进行了操作,但我无法解决问题。

问题:当我从控制台Firebase发送通知时,我收到完全通知的通知,但是从Firebase发送相同的通知,我的应用程序在后台我没有收到任何数据,但是如果我打开应用程序,应用程序会显示我通知,但从不在后台。有趣的是,第二天我通过封闭的应用程序在后台收到所有通知。

设备:iPhone 6 - v10.0.1

编辑:我的有效载荷: enter image description here

当我在Firebase中发送通知时,我收到此有效负载,我在Firebase中选择了高优先级,但我没有在有效负载中获得任何优先级。

我的代码:

#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {



    [self registerForRemoteNotifications];

    [FIRApp configure];
    [self connectToFcm];

    return YES;

}

- (void)registerForRemoteNotifications {


    if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
            if(!error){
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            }
        }];

        NSLog(@"Version >= 10");
    }
    else {

        NSLog(@"version < 10");
        // Code for old versions
    }
}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{

    NSLog(@"MODO 1: User Info: %@",notification.request.content.userInfo);
    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}

//Called to let your app know which action was selected by the user for a given notification.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{

    NSLog(@"MODO 2: User Info: %@",response.notification.request.content.userInfo);
    completionHandler();
}

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

}


- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

    NSLog(@"My token is: %@", deviceToken);
}

- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error {
    NSLog(@"Failed to get token, error: %@", error);
}


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {


    for (NSString *key in userInfo) {

        NSLog(@"key value: %@", key);
        if ([key isEqualToString:@"notification"]) {
            NSString *body = [[userInfo valueForKeyPath:key] objectForKey:@"body"];

            NSLog(@"message content: %@", body);

            UILocalNotification *notification = [[UILocalNotification alloc] init];
            notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
            notification.repeatInterval = NSDayCalendarUnit;
            notification.alertBody = body;
            notification.timeZone = [NSTimeZone defaultTimeZone];
            notification.soundName = UILocalNotificationDefaultSoundName;
            notification.applicationIconBadgeNumber = 0;

            [[UIApplication sharedApplication] scheduleLocalNotification:notification];

        }
    }

    NSLog(@"Message ID: %@", userInfo[@"gcm.message_id"]);

    if( [UIApplication sharedApplication].applicationState == UIApplicationStateInactive )
    {
        NSLog( @"INACTIVE" );
        completionHandler( UIBackgroundFetchResultNewData );
    }
    else if( [UIApplication sharedApplication].applicationState == UIApplicationStateBackground )
    {
        NSLog( @"BACKGROUND" );
        completionHandler( UIBackgroundFetchResultNewData );
    }
    else
    {
        NSLog( @"FOREGROUND" );
        completionHandler( UIBackgroundFetchResultNewData );
    }
}

- (void)applicationDidEnterBackground:(UIApplication *)application {

    NSLog(@"enter in background");

}


- (void)connectToFcm {
    [[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
        if (error != nil) {
            NSLog(@"Unable to connect to FCM. %@", error);
        } else {
            NSLog(@"Connected to FCM.");

            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"registeredToFCM"];
            [[NSUserDefaults standardUserDefaults] synchronize];


        }
    }];
}

0 个答案:

没有答案