来自firebase控制台iOS 12.2的推送通知不工作

来自firebase控制台iOS 12.2的推送通知不工作,ios,swift,firebase,firebase-cloud-messaging,apple-push-notifications,Ios,Swift,Firebase,Firebase Cloud Messaging,Apple Push Notifications,推送通知根本不起作用。到目前为止,我已经尝试了所有可能的措施: 这是我尝试过的代码: 在didfishlaunchingwithoptions中 FirebaseApp.configure() if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.b

推送通知根本不起作用。到目前为止,我已经尝试了所有可能的措施:

这是我尝试过的代码:

didfishlaunchingwithoptions中

FirebaseApp.configure()

if #available(iOS 10.0, *) {
    let center = UNUserNotificationCenter.current()
    center.delegate = self
    center.requestAuthorization(options: [.badge, .alert, .sound]) {
        (granted, error) in
        if granted {
            DispatchQueue.main.async {
                application.registerForRemoteNotifications()
                //UIApplication.shared.registerForRemoteNotifications()
            }
        } else {
            //print("APNS Registration failed")
            //print("Error: \(String(describing: error?.localizedDescription))")
        }
    }
} else {
    let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
    let setting = UIUserNotificationSettings(types: type, categories: nil)
    application.registerUserNotificationSettings(setting)
    application.registerForRemoteNotifications()
    //UIApplication.shared.registerForRemoteNotifications()
}
然后,注册并失败方法:

private func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    Messaging.messaging().apnsToken = deviceToken as Data
    print("Registered Notification")
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {

        print(error.localizedDescription)
        print("Not registered notification")
}

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

    // Receive displayed notifications for iOS 10 devices.
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo

        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)

        // Print message ID.
        if let messageID = userInfo["gcm.message_id"] {
            print("Message ID: \(messageID)")
        }

        // Print full message.
        print(userInfo)

        // Change this to your preferred presentation option
        completionHandler([])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        // Print message ID.
        if let messageID = userInfo["gcm.message_id"] {
            print("Message ID: \(messageID)")
        }

        // Print full message.
        print(userInfo)

        completionHandler()
    }
}
注:

  • 到目前为止,我已经在真正的设备上尝试了无推送通知
  • 在中打开推送通知后,我已仔细检查了证书并重新生成了配置文件 能力
  • 我还添加了后台模式->远程通知
  • 我试过用legacy build也没有运气
  • 我多次尝试重新安装应用程序,但都不起作用
  • FirebaseAppDelegateProxyEnabled在plist中设置为“否”,但仍然不走运
  • 还更新了豆荚,还是没有运气
  • .p12证书位于firebase控制台,仍不工作

从上一周开始,我尝试了不同的项目,使用Apple key使用不同的身份验证方法,但仍然没有成功。

以下是我用来生成推送通知的代码,希望这对您有所帮助

将以下全部代码放入您的appdelegate中

导入的库

 import Firebase
import FirebaseMessaging
import UserNotifications
import FirebaseInstanceID
import UserNotifications
将MessagingDelegate添加到您的appdelegate

然后

在didFinishLaunchingWithOptions中

 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: { (bool, err) in

        })

    } else {

        let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)

    }

    application.registerForRemoteNotifications()
    UIApplication.shared.applicationIconBadgeNumber = 0

    FirebaseApp.configure()
    // [START set_messaging_delegate]
    Messaging.messaging().delegate = self
    let token = Messaging.messaging().fcmToken
    print("FCM token: \(token ?? "")")
然后将这两个函数相加

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
    // 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

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // Print message ID.
    if let messageID = userInfo[gcmMessageIDKey] {
        print("Message ID: \(messageID)")
    }

    // Print full message.
    print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    // 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

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // put your json parameters here Print message ID.
    if let messageID = userInfo[gcmMessageIDKey] {
        print("Message ID: \(messageID)")
    }

    if let msg = userInfo["desc"] as? String
    {
        let title = userInfo["noti_title"] as? String
        createNotification(message: msg, title: title ?? "" )

    }

    // Print full message.
    print(userInfo)

    completionHandler(UIBackgroundFetchResult.newData)
}


func createNotification(message: String, title: String) {

    let content = UNMutableNotificationContent()
    content.title =  title
    content.body = message


    let triger = UNTimeIntervalNotificationTrigger(timeInterval: 2, repeats: false )
    let request = UNNotificationRequest(identifier: "TextMessage", content: content, trigger: triger)



    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
然后添加这些函数以获得FCMToken

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print("APNs token retrieved: \(deviceToken)")

        // With swizzling disabled you must set the APNs token here.
        if let refreshedToken = InstanceID.instanceID().token() {
            print("InstanceID token: \(refreshedToken)")

        }
        let tokenT = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print(tokenT)
        guard let token = InstanceID.instanceID().token() else {return}
        AppDelegate.DEVICEID = token
        print(token)
        UserDefaults.standard.set(token, forKey: "token")

        connectToFCM()


    }
    func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
        guard  let newToken = InstanceID.instanceID().token() else {return}
        AppDelegate.DEVICEID = newToken
        UserDefaults.standard.set(newToken, forKey: "token")

        connectToFCM()
    }
    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        print("Received data message: \(remoteMessage.appData)")
        print(remoteMessage.appData["notification"]!)
//        let info = response.notification.request.content.userInfo

//        if let message = info["messages"] {
//            print(message)
//        }
    }
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Firebase registration token: \(fcmToken)")
        UserDefaults.standard.set(fcmToken, forKey: "token")




    }
然后在应用程序代理中添加以下扩展

extension AppDelegate : UNUserNotificationCenterDelegate {

    // Receive displayed notifications for iOS 10 devices.
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification,                            withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        let userInfo = notification.request.content.userInfo

        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID)")
        }

        print(userInfo)

        // Change this to your preferred presentation option
        completionHandler([.alert,.badge,.sound])
    }


    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let application = UIApplication.shared

        if(application.applicationState == .active){
            print("user tapped the notification bar when the app is in foreground")

            window = UIWindow(frame: UIScreen.main.bounds)
            window?.makeKeyAndVisible()

            //        let layout = UICollectionViewFlowLayout()
            window?.rootViewController = UINavigationController(rootViewController: NotificationViewController())


        }

        if(application.applicationState == .inactive)
        {
            print("user tapped the notification bar when the app is in background")
            window = UIWindow(frame: UIScreen.main.bounds)
            window?.makeKeyAndVisible()

            //        let layout = UICollectionViewFlowLayout()
            window?.rootViewController = UINavigationController(rootViewController: NotificationViewController())

        }

        /* Change root view controller to a specific viewcontroller */
        // let storyboard = UIStoryboard(name: "Main", bundle: nil)
        // let vc = storyboard.instantiateViewController(withIdentifier: "ViewControllerStoryboardID") as? ViewController
        // self.window?.rootViewController = vc

        completionHandler()
    }

    func connectToFCM()
    {
        Messaging.messaging().shouldEstablishDirectChannel = true
    }
    func initializeNotificationServices() -> Void {
        let settings = UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)

        // This is an asynchronous method to retrieve a Device Token
        // Callbacks are in AppDelegate.swift
        // Success = didRegisterForRemoteNotificationsWithDeviceToken
        // Fail = didFailToRegisterForRemoteNotificationsWithError
        UIApplication.shared.registerForRemoteNotifications()
    }

}

希望这对您有所帮助。

您是否检查过在单个设备令牌上发送firebase测试通知?@Nikung我正在尝试使用firebase发送消息,但目前不在后端,无法工作是的,我正在尝试使用多个令牌,而不是单个令牌。在这个条件下,您将获得什么输出:如果允许{DispatchQueue.main.async{application.registerforremotentifications()//UIApplication.shared.registerforremotentifications()}其他{print(“APNS注册失败”)print(“错误:(字符串(描述:错误?.localizedDescription))}@Nikunj stack上有人说应用程序。registerForRemoteNotifications()应该在主线程上而不是在后台线程上,输出是它正在被授予,并且成功代码正在运行。所以你是说,当我处于开发阶段时,我仍然需要将production.p12证书交给firebase,以使其正常工作?不,我刚才说的是,使用有问题的代码,它的工作非常完美。对于证书密钥,你呢如果要发布应用程序,应使用生产密钥。开发证书不适用于已发布或已发布的应用程序,因为生产证书适用于开发和发布的两种方案。您能给我一个链接吗?您怎么说?我也尝试过生产证书?仍然不起作用?我已经添加了代码更新了我的答案请匹配并比较你的代码和我的代码这将帮助你…祈求好运…:)并测试代码转到firebase messaging并从那里生成通知如果你在屏幕上弹出相同的生成通知,则其工作仍然不工作现在尝试使用APN键也仍然不工作。