#ios #swift #firebase #apple-push-notifications #firebase-cloud-messaging
#iOS #swift #firebase #apple-push-уведомления #firebase-облако-обмен сообщениями
Вопрос:
У меня есть FCM
работа, но я не могу заставить работать традиционные уведомления о баннерах.
Вот что у меня есть в моем AppDelegate.swift
файле:
import UIKit
import Firebase
import UserNotifications
@UIApplicationMain
final class AppDelegate: UIResponder {
var window: UIWindow?
override init() {
super.init()
FIRApp.configure()
}
}
// MARK: - UIApplicationDelegate
extension AppDelegate: UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: { _, _ in })
UNUserNotificationCenter.current().delegate = self
FIRMessaging.messaging().remoteMessageDelegate = self
application.registerForRemoteNotifications()
NotificationCenter.default.addObserver(self, selector: #selector(tokenRefreshNotification), name: .firInstanceIDTokenRefresh, object: nil)
return true
}
func tokenRefreshNotification(notification: Notification) {
if let refreshedToken = FIRInstanceID.instanceID().token() {
print("InstanceID token: (refreshedToken)")
}
connectToFcm()
}
func connectToFcm() {
FIRMessaging.messaging().connect { error in
if error != nil {
print("Unable to connect with FCM. (error)")
} else {
print("Connected to FCM.")
}
}
}
func applicationDidBecomeActive(_ application: UIApplication) {
connectToFcm()
}
}
// MARK: - UNUserNotificationCenterDelegate
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let userInfo = notification.request.content.userInfo
print("Message ID: (userInfo["gcm.message_id"]!)")
print(userInfo)
completionHandler([.alert, .sound])
}
}
// MARK:
extension AppDelegate: FIRMessagingDelegate {
func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) {
print("FIRMessagingRemoteMessage Received: (remoteMessage.appData)")
}
}
Все настроено в соответствии с документацией. Я получаю выходные данные консоли, когда отправляю сообщения в свое приложение через консоль уведомлений в Firebase.
Однако баннеры не отображаются при отправке уведомлений. Когда приложение находится в фоновом режиме, уведомления также не отправляются — только когда приложение находится на переднем плане.
Ищу помощь. Заранее спасибо!
Комментарии:
1. Успешно ли сгенерирован токен?
2. @NaveenRamanathan Я только что создал новое свойство —
let token = FIRInstanceID.instanceID().token()!
и это привело к сбою. Я предполагаю, что он не был успешно сгенерирован. Однако в документах никогда не упоминался токен…3. Токен будет сгенерирован после вызова tokenRefreshNotification. Если вы попытаетесь получить токен до того, как он будет сгенерирован, ваше приложение выйдет из строя. Вызывается ли метод tokenRefreshNotification и печатает ли токен print(«Токен InstanceID: (обновленный токен)»)?
4. Он не напечатал токен.
5. С какой версией устройства iOS вы тестируете
Ответ №1:
Попробуйте отключить метод swizzling.
Add FirebaseAppDelegateProxyEnabled to info.plist and set it to NO
.
Затем добавьте этот код в делегат приложения
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenTypeSandbox)
}
Удалите свое приложение с устройства и переустановите его.
пожалуйста, проверьте, вызывается ли application:didRegisterForRemoteNotificationsWithDeviceToken
. Если оно вызвано, попробуйте отправить уведомление из консоли firebase.
Комментарии:
1. Сейчас работает, но я не понимаю. Разве в iOS 10 не было введено
UNUserNotificationCenterDelegate
запрещение использованияUIApplicationDelegate
методов?2. Нет, они этого не сделали developer.apple.com/reference/uikit/uiapplicationdelegate / … . application:didregister forremotenotificationswithdevicetoken все еще используется и полностью отличается от UNUserNotificationCenterDelegate. Firebase использует метод swizzling для обработки Didregister forremotenotificationswithdevicetoken. Иногда это не работает. UNUserNotificationCenterDelegate предоставляет обратные вызовы для обработки пользовательских взаимодействий, связанных с push-уведомлением. Это происходит после получения push-уведомления. Надеюсь, это поможет.
3. Спасибо за разъяснение!