【问题标题】:firebase iOS not receive push notificationsfirebase iOS 收不到推送通知
【发布时间】:2016-05-25 07:37:06
【问题描述】:

我在我的应用程序中加入了 google firebase - 创建 google 帐户,创建 google 应用程序,上传 APNS 认证(.pem 并在另一个服务中工作),并从控制台发送推送通知,但我的应用程序没有收到它。在 Firebase 控制台中,我看到状态已完成,但大约设备数量为“-”

我当然更新了条款配置文件和 APNS 证书

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    // Register for remote notifications
    if #available(iOS 8.0, *) {
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
    } else {
        // Fallback
        let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound]
        application.registerForRemoteNotificationTypes(types)
    }


    FIRApp.configure()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotificaiton),
                                                     name: kFIRInstanceIDTokenRefreshNotification, object: nil)
}      

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                 fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

    print(userInfo)
}

func tokenRefreshNotificaiton(notification: NSNotification) {
    if let refreshedToken = FIRInstanceID.instanceID().token() {
        print("InstanceID token: \(refreshedToken)")

        User.sharedUser.googleUID = refreshedToken
    }
}


func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {

    print(userInfo)
}

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod)
}

func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {

    print(userInfo)
}

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                 fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {


    print(userInfo)
}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {

    print("ошибка")
    print(error)
    print(error.description)

}

【问题讨论】:

  • 发布您的application:didRegisterForRemoteNotificationsWithDeviceToken:application:didFailToRegisterForRemoteNotificationsWithError: 代码。
  • 弗兰克,这段代码 FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod) 的目的是什么?在 Firebase 示例中并没有说需要它。

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


【解决方案1】:

我看到的第一件事是没有呼叫连接到FIRMessaging。尝试将此添加到您的AppDelegate

func applicationDidBecomeActive(application: UIApplication) {
    FIRMessaging.messaging().connectWithCompletion { error in
        print(error)
    }
}

【讨论】:

  • 谢谢 :) 它工作完美,我更新我的证书并添加此代码
【解决方案2】:

使用以下代码。

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()
}

【讨论】:

    【解决方案3】:

    您可能在 PUSH JSON 中使用 Data 或 aps 键,用于向设备发送通知。它应该可以正常工作,但在极少数情况下,它不起作用,即使它可以让您在 fcm/send api 中取得成功,但通知不会到达特定设备。此问题通常发生在 iOS 设备上。

    对我有用的解决方案是添加通知键而不是数据。

    { 
        "to" : "device token",
        "notification":{
                "body": "test",
                "title": "test"
                    }
    }
    

    如果您从后端发送,或者您无权访问 Firebase 控制台。然后您也可以通过 POSTMAN 测试和发送通知。但您必须拥有 SERVER KEY,可以从 Firebase 控制台的 Cloud Messaging 设置下获取。

    API: https://fcm.googleapis.com/fcm/send
    Method: POST
    Headers:
    "Content-Type"=application/json
    "Authorization"="key=YOUR SERVER KEY" //You must add key= above the server key.
    { 
        "to" : "your device token",
        "notification":{
                "body": "test",
                "title": "test"
                    }
    
    }
    

    如果您需要查看我们可以在 FireBASE 通知中发送的内容,请提供另一个详细且完整的负载:

    {
    "to":"device token",
    "notification":{
    "data":{
    "avatar":"",
    "body":"",
    "key_notification":"0",
    "type_notification":"1",
    "deviceToken":"device token",
    "badge":1,
    "message":"your text"
    },
    "text":"your text",
    "sound":"sound.caf",
    "badge":21
    },
    "priority":"high"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多