应用程序关闭时,休息Api Firebase通知无法在Swift 4中工作

时间:2018-04-22 11:39:57

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

我已经在我的应用中使用了苹果推送通知服务并且我收到了证书并且运行良好但是现在我的问题是,当我使用Firebase rest API发送消息作为通知时,我将不会收到任何通知iPhone直到我运行应用程序但是当我使用Firebase时它会正常工作,这里是我的代码:

import UIKit
import Firebase
import FirebaseMessaging
import FirebaseInstanceID
import UserNotifications

 @UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    NotificationCenter.default.addObserver(self, selector: #selector(self.refreshToken(notification:)), name: NSNotification.Name.InstanceIDTokenRefresh, object: nil)
    Messaging.messaging().isAutoInitEnabled = true

    FirebaseApp.configure()

    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert , .badge , .sound]) { (success, error) in
        }
    } else {
        UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
        UIApplication.shared.registerForRemoteNotifications()
        // Fallback on earlier versions
    }

    application.registerForRemoteNotifications()

    return true
}


func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    #if PROD_BUILD
        FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .prod)
    #else
        InstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox)
    #endif


        Messaging.messaging().subscribe(toTopic: "global")
}


func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {

        Messaging.messaging().subscribe(toTopic: "global")

    print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {


    Messaging.messaging().appDidReceiveMessage(userInfo)

    if Messaging.messaging().fcmToken != nil {
        Messaging.messaging().subscribe(toTopic: "global")
    }

    // Print full message.
    print(userInfo)

    completionHandler(UIBackgroundFetchResult.newData)
}

func applicationDidEnterBackground(_ application: UIApplication) {

    Messaging.messaging().shouldEstablishDirectChannel = false
}

func applicationDidBecomeActive(_ application: UIApplication) {
    FBHandler()
}


@objc func refreshToken(notification : NSNotification) {

    let refreshToken = InstanceID.instanceID().token()!
    print("***\(refreshToken)")
    FBHandler()
}

func FBHandler() {

    Messaging.messaging().shouldEstablishDirectChannel = true
}
}

1 个答案:

答案 0 :(得分:0)

要让APNS在后台工作,您需要在功能部分启用后台模式并勾选远程通知。

enter image description here

完成后,在AppDelegate类中添加/检查此委托方法

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
    print("APNS USER INFO: \(userInfo)")
}

当app处于后台并且APNS到来时,此方法将触发。

更多信息: How to handle push notification in background in ios 10?

更新:

也添加这个,看看它是否有效

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        print("APNS: \(response.notification.request.content.userInfo)")
 }