从Firebase控制台iOS 12.2推送通知不起作用

时间:2019-04-25 06:37:55

标签: ios swift firebase firebase-cloud-messaging apple-push-notifications

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

这是我尝试过的代码:

cordova plugin rm cordova-plugin-ionic-webview cordova plugin add cordova-plugin-ionic-webview@latest

didFinishLaunchingWithOptions

然后注册并失败方法:

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

注意:

  
      
  • 到目前为止,我已经在没有推送通知的真实设备上尝试过。
  •   
  • 我在打开了推送通知后仔细检查了证书并重新生成了配置文件   功能。
  •   
  • 我还添加了后台模式->启用了远程通知。
  •   
  • 我尝试过旧版构建,也没有运气。
  •   
  • 我已尝试多次重新安装应用程序,但无法正常运行。
  •   
  • FirebaseAppDelegateProxyEnabled在plist中设置为NO还是没有运气。
  •   
  • 还更新了豆荚,仍然没有运气。
  •   
  • .p12证书在Firebase控制台上,但仍无法正常工作。
  •   

从上个星期开始,尝试使用Apple密钥使用不同身份验证方法的不同项目,但我仍然尝试过运气。

1 个答案:

答案 0 :(得分:1)

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

将下面的全部代码放入您的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()
    }

}

希望这对您有帮助。