当应用程序关闭时,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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 OAuth2 保护单体私有 REST api? [关闭]
Rest,Rest Api,Web Service,RestFul Api之间的区别[关闭]