为什么我在控制台ios10.2上接收消息时没有获得横幅和后台模式推送通知

时间:2017-02-15 20:47:00

标签: ios firebase push-notification firebase-cloud-messaging

这些是我的设置:

project settings

Project settings2

这是我的appDelegate

#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
#endif
//#import "FIRMessaging.h"
//#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice       currentDevice] systemVersion] compare:v options:NSNumericSearch] !=   NSOrderedAscending)
@import UIKit;
@import Firebase;
@import FirebaseMessaging;
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >=   __IPHONE_10_0
#endif
@interface AppDelegate ()
{
NSTimer *timer1;
}
@end
// 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

@implementation AppDelegate 
NSString *const kGCMMessageIDKey = @"gcm.message_id";

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

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
     // [START register_for_notifications]
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
        UIUserNotificationType allNotificationTypes =
        (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
        UIUserNotificationSettings *settings =
        [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    } 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].delegate = self;
        // For iOS 10 data message (sent via FCM)
        [FIRMessaging messaging].remoteMessageDelegate = self;
 #endif
    }

    [[UIApplication sharedApplication] registerForRemoteNotifications];
    // [END register_for_notifications]
}

  [FIRApp configure];
 ..../

加上所有这些app delegate回拨

     - (void)application:(UIApplication *)application      didReceiveRemoteNotification:(NSDictionary *)userInfo {
// If you are receiving a notification message while your app is in the background,
// this callback will not be fired till the user taps on the notification launching the application.
// TODO: Handle data of notification

// Print message ID.
  // if (userInfo[kGCMMessageIDKey]) {
 //      NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
//}

 // Print full message.
  NSLog(@"%@", userInfo);
 }
 - (void)application:(UIApplication *)application     didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

// Print message ID.
if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
}

// Print full message.
NSLog(@"%@", userInfo);

completionHandler(UIBackgroundFetchResultNewData);
 }
// [END receive_message]

// [START ios_10_message_handling]
// Receive displayed notifications for iOS 10 devices.
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >=  __IPHONE_10_0
// Handle incoming notification messages while app is in the  foreground.
 - (void)userNotificationCenter:(UNUserNotificationCenter *)center
   willPresentNotification:(UNNotification *)notification
     withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
// Print message ID.
NSDictionary *userInfo = notification.request.content.userInfo;
if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
}

// Print full message.
NSLog(@"%@", userInfo);

// Change this to your preferred presentation option
completionHandler(UNNotificationPresentationOptionNone);
}

  // Handle notification messages after display notification is tapped by the user.
   - (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
      withCompletionHandler:(void (^)())completionHandler {
 NSDictionary *userInfo =    response.notification.request.content.userInfo;
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler();
  }
  #endif
  // [END ios_10_message_handling]

  // [START ios_10_data_message_handling]
  #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >=   __IPHONE_10_0
  // Receive data message on iOS 10 devices while app is in the foreground.
   - (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage   *)remoteMessage {
  // Print full message
  NSLog(@"%@", remoteMessage.appData);
  }
  #endif
// [END ios_10_data_message_handling]

 // [START refresh_token]
 - (void)tokenRefreshNotification:(NSNotification *)notification {
// Note that this callback will be fired everytime a new token is   generated, including the first
// time. So if you need to retrieve the token as soon as it is available this is where that
// should be done.
NSString *refreshedToken = [[FIRInstanceID instanceID] token];
NSLog(@"InstanceID token: %@", refreshedToken);

// Connect to FCM since connection may have failed when attempted  before having a token.
[self connectToFcm];

// TODO: If necessary send token to application server.
}
// [END refresh_token]

// [START connect_to_fcm]
- (void)connectToFcm {
// Won't connect since there is no token
if (![[FIRInstanceID instanceID] token]) {
    return;
}

// Disconnect previous FCM connection if it exists.
[[FIRMessaging messaging] disconnect];

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

  - (void)application:(UIApplication *)application  didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Unable to register for remote notifications: %@", error);
}

  // This function is added here only for debugging purposes, and can be removed if swizzling is enabled.
  // If swizzling is disabled then this function must be implemented so that the APNs token can be paired to
 // the InstanceID token.
  - (void)application:(UIApplication *)application  didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
   NSLog(@"APNs token retrieved: %@", deviceToken);

  // With swizzling disabled you must set the APNs token here.
 [[FIRInstanceID instanceID] setAPNSToken:deviceToken     type:FIRInstanceIDAPNSTokenTypeSandbox];
 }

 // [START connect_on_active]
 - (void)applicationDidBecomeActive:(UIApplication *)application {
[self connectToFcm];
  }
  // [END connect_on_active]

  // [START disconnect_from_fcm]
  - (void)applicationDidEnterBackground:(UIApplication *)application {
  [[FIRMessaging messaging] disconnect];
  NSLog(@"Disconnected from FCM");
  }
  // [END disconnect_from_fcm]

虽然我在控制台中收到了消息,但我无法在后台获取横幅和通知。(- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage已被触发)。

也没有声音,所有配置文件都已完成,以防万一。

2 个答案:

答案 0 :(得分:0)

您需要在if语句之前调用[FIRApp configure]!

答案 1 :(得分:0)

好的解决了。您需要在Apple开发人员站点中设置应用程序ID,并在开发和分发上启用推送通知(不要伪造捆绑ID必须与Xcode上的捆绑ID相匹配)。之后,您需要为此创建配置文件应用程序ID并将其安装在您的mac.Last但最重要的是您需要在Firebase控制台中放入从钥匙串访问生成的p12文件。在firebase控制台中,概述旁边有一个灰色齿轮按钮。您选择该选项,然后选择云消息传递选项卡,并在展开推送通知认证并导出p12文件时上载在钥匙串访问中生成的p12证书文件。您需要输入密码并将其上传到firebase。