未收到Firebase到iOS App的推送通知

时间:2017-08-05 05:43:59

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

我已经在FCM上传了开发和生产证书,在我的项目中的功能,已放置GoogleService-Info.plist中启用了推送通知。 我尝试过制作另一个Google帐户并再次尝试所有程序,但没有任何对我有用。

我尝试向单个设备令牌发送通知,但它被拒绝显示"无效的注册令牌。检查令牌格式"

以下是我尝试的代码。

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

    NSError *configureError;
[[GGLContext sharedInstance] configureWithError:&configureError];
NSAssert(!configureError, @"Error configuring Google services: %@", configureError);



GAI *gai = [GAI sharedInstance];
gai.trackUncaughtExceptions = YES;
gai.logger.logLevel = kGAILogLevelVerbose;

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    UIRemoteNotificationType allNotificationTypes =
    (UIRemoteNotificationTypeSound |
     UIRemoteNotificationTypeAlert |
     UIRemoteNotificationTypeBadge);
    [application registerForRemoteNotificationTypes:allNotificationTypes];
#pragma clang diagnostic pop
} else {

    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 {

#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0

        [UNUserNotificationCenter currentNotificationCenter].delegate = self;
        UNAuthorizationOptions authOptions =
        UNAuthorizationOptionAlert
        | UNAuthorizationOptionSound
        | UNAuthorizationOptionBadge;
        [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) {
        }];


        [FIRMessaging messaging].remoteMessageDelegate = self;
#endif
    }

    [[UIApplication sharedApplication] registerForRemoteNotifications];
}


[FIRApp configure];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshNotification:)
                                             name:kFIRInstanceIDTokenRefreshNotification object:nil];
    return YES;


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

[[FIRMessaging messaging] disconnect];

}

- (void)applicationDidBecomeActive:(UIApplication *)application {
[self connectToFirebase];


 application.applicationIconBadgeNumber = 0;
}

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

}

#pragma mark -- Custom Firebase code


- (void)tokenRefreshCallback:(NSNotification *) notification{
NSString *refreshedToken = [[FIRInstanceID instanceID] token];

[self connectToFirebase];
}

-(void) connectToFirebase{

[[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error)
 {
     if ( error != nil)
     {

     }
     else
     {

     }
 }];
}
- (void)applicationWillResignActive:(UIApplication *)application {}


- (void)applicationWillEnterForeground:(UIApplication *)application {}


- (void)applicationWillTerminate:(UIApplication *)application {}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
if (userInfo[kGCMMessageIDKey]) {

    NSLog(@"%@",userInfo);
}}


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

NSDictionary *userInfo = notification.request.content.userInfo;
if (userInfo[kGCMMessageIDKey]) {

}


completionHandler(UNNotificationPresentationOptionNone);
}

 - (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
     withCompletionHandler:(void (^)())completionHandler {
   NSDictionary *userInfo = response.notification.request.content.userInfo;
if (userInfo[kGCMMessageIDKey]) {

}

completionHandler();
  }

- (void)connectToFcm {

if (![[FIRInstanceID instanceID] token]) {
    return;
}

[[FIRMessaging messaging] disconnect];

[[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
    if (error != nil) {

    } else {

    }
}];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"PUSH ERROR: %@", error);
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"%@",deviceToken);
}

- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage {

}

- (void)tokenRefreshNotification:(NSNotification *)notification {

NSString *refreshedToken = [[FIRInstanceID instanceID] token];    
NSLog(@"%@",refreshedToken);

[self connectToFcm];

}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{

[application registerForRemoteNotifications];
}

3 个答案:

答案 0 :(得分:0)

您似乎正在使用设备令牌从firebase控制台发送推送通知。如果是这样,则不应使用设备令牌。相反,Firebase会为您提供FCMRegistration令牌。尝试使用该令牌向该特定设备发送通知。

摘自我的文章。

  

要向我们需要的特定设备发送推送通知   设备令牌。在设备上运行应用程序时(不在   模拟器)如果您的设置正确,您的控制台将打印   设备令牌和FCM注册令牌。两者都相似但不是   相同。我们在发送推送通知时使用的设备令牌   通过一些第三方服务或我们自己的服务器。我们使用FCM   注册令牌,如果我们通过发送推送通知   firebase控制台。所以在我们的例子中,我们采用FCM注册令牌   打印在控制台上。

enter image description here 以下是关于How to send push notifications using firebase

的文章

添加个人信息:如果您想尝试检查推送通知代码是否配置正确,请使用第三方库,例如Pusher 但是这次使用推送器中的设备令牌进行检查。

答案 1 :(得分:0)

这可能是你遇到的问题。

您需要为您的APNS上传正确的.p12文件。

您只需转到项目设置,然后在云消息传递

您需要添加.p12文件。

enter image description here

上传后,您需要重新下载配置文件并替换旧文件。

解决方案2

如果您能理解,我上传了快速代码,然后将其转换为objective-c,因为我没有使用Objective-c代码。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      FirebaseApp.configure()
    if #available(iOS 10.0, *) {
      // For iOS 10 display notification (sent via APNS)
      UNUserNotificationCenter.current().delegate = self

      let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
      UNUserNotificationCenter.current().requestAuthorization(
        options: authOptions,
        completionHandler: {_, _ in })
    } else {
      let settings: UIUserNotificationSettings =
        UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
      application.registerUserNotificationSettings(settings)
    }
    application.registerForRemoteNotifications()

    return true
  }

func application(_ application: UIApplication,
                   didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Messaging.messaging().apnsToken = deviceToken as Data
    var token: String = ""
    for i in 0..<deviceToken.count {
      token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
    }

    print(token)
  }

功能标签中,它也应该是

enter image description here

答案 2 :(得分:0)

使用此代码:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    if #available(iOS 10.0, *)
    {
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.currentNotificationCenter().delegate = self
        UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert])          { (granted, error) in
                if granted
                {
                //self.registerCategory()
             }
         }
         // For iOS 10 data message (sent via FCM)
         FIRMessaging.messaging().remoteMessageDelegate = self
    }
    else
    {
        let settings: UIUserNotificationSettings =  UIUserNotificationSettings(forTypes: [.Alert,.Badge,.Sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    }          
    application.registerForRemoteNotifications()        
    //Configuring Firebase
    FIRApp.configure()
    // Add observer for InstanceID token refresh callback.
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotification), name: kFIRInstanceIDTokenRefreshNotification, object: nil)     
     return true
}

//Receive Remote Notification on Background
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
{
    FIRMessaging.messaging().appDidReceiveMessage(userInfo)
}

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
{
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox)
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod)
}

func tokenRefreshNotification(notification: NSNotification)
{
    if let refreshedToken = FIRInstanceID.instanceID().token()
    {
            print("InstanceID token: \(refreshedToken)")
    }
    // Connect to FCM since connection may have failed when attempted before having a token.
    connectToFcm()
}

func connectToFcm()
{
    FIRMessaging.messaging().connectWithCompletion { (error) in
            if (error != nil)
            {
                print("Unable to connect with FCM. \(error)")
            }
            else
            {
                print("Connected to FCM.")
            }
    }
}

func applicationDidBecomeActive(application: UIApplication)
{            
    connectToFcm()
}