我使用Firebase作为后端。 我还使用FCM作为Firebase提供的功能之一。 FCM在iOS 10中工作良好,但在切换到iOS 11后,推送通知停止发送到用户设备,我自己也没有收到从云函数或Firebase控制台的“通知”部分发送的任何推送通知。 如何解决这个问题?
更新:我从Firebase Notifcations发送了几个推送通知,但它们没有到达。
// MARK: - Push notification
extension AppDelegate: UNUserNotificationCenterDelegate {
func registerPushNotification(_ application: UIApplication) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
// For iOS 10 data message (sent via FCM)
Messaging.messaging().delegate = self
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
//When the notifications of this code worked well, there was not yet.
Messaging.messaging().apnsToken = deviceToken
}
// [START receive_message]
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
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
debugPrint("Message ID: \(messageID)")
}
// Print full message.
debugPrint(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
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: \(messageID)")
}
// Print full message.
debugPrint(userInfo)
completionHandler(.newData)
}
// showing push notification
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if let userInfo = response.notification.request.content.userInfo as? [String : Any] {
let routerManager = RouterManager()
routerManager.launchRouting(userInfo)
}
completionHandler()
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
if let userInfo = notification.request.content.userInfo as? [String : Any] {
if let categoryID = userInfo["categoryID"] as? String {
if categoryID == RouterManager.Categories.newMessage.id {
if let currentConversation = ChatGeneralManager.shared.currentChatPersonalConversation, let dataID = userInfo["dataID"] as? String {
// dataID is conversationd id for newMessage
if currentConversation.id == dataID {
completionHandler([])
return
}
}
}
}
if let badge = notification.request.content.badge {
AppBadgesManager.shared.pushNotificationHandler(userInfo, pushNotificationBadgeNumber: badge.intValue)
}
}
completionHandler([.alert,.sound, .badge])
}
}
// [START ios_10_data_message_handling]
extension AppDelegate : MessagingDelegate {
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
let pushNotificationManager = PushNotificationManager()
pushNotificationManager.saveNotificationTokenInDatabase(token: fcmToken, success: nil, fail: nil)
}
// Receive data message on iOS 10 devices while app is in the foreground.
func application(received remoteMessage: MessagingRemoteMessage) {
debugPrint(remoteMessage.appData)
}
}