当应用程序关闭时,Rest Api Firebase 通知在 Swift 4 中不起作用

Posted

技术标签:

【中文标题】当应用程序关闭时,Rest Api Firebase 通知在 Swift 4 中不起作用【英文标题】:Rest Api Firebase Notification Won't Work In Swift 4 When App Is Closed 【发布时间】:2018-04-22 11:39:56 【问题描述】:

我在我的应用程序中使用了苹果推送通知服务,我收到了证书,它运行良好但现在我的问题是,当我使用 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】:

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

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

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

当应用程序处于后台并且 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)")
 

【讨论】:

这不再起作用,正如您在我的代码中看到的,主题应该是“全局”,但在您的代码中,我看不到它再次起作用,但不在应用程序之外当我运行应用程序时收到通知 我无法对此进行测试,因为我的目标 iOS 是 9.3.5,当我添加此代码时,如果 iOS 10.0 可用,它将显示我可以使用它,你可以为 iOS 9.0 编辑它吗? ok 但是使用 func userNotificationCenter(_ center: 这个方法需要 iOS 10 而不是 9.3.5 但是在你的代码中你已经添加了版本支持。你也可以在 iOS 10 中测试应用程序吗? 否,因为当您想获得推送通知证书时,您需要提交您的 iPhone 进行测试,所以我使用我的 iPhone 4s 说 iOS 是 9.3.5 还是我错了?如果我可以在其他 iPhone 上测试通知,请告诉我

以上是关于当应用程序关闭时,Rest Api Firebase 通知在 Swift 4 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

电子中的 REST API [关闭]

使用 OAuth2 保护单体私有 REST api? [关闭]

Rest,Rest Api,Web Service,RestFul Api之间的区别[关闭]

Websocket API 取代 REST API? [关闭]

REST API 和 Websocket API [关闭]

REST API 是不是有任何命名约定准则? [关闭]