#ios #swift #apple-push-notifications
Вопрос:
Я реализовал push-уведомление в приложении. Я получаю обратные вызовы по следующему методу делегата всякий раз, когда приходит толчок.
func application(_: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
Я реализовал следующий метод делегирования, чтобы показывать push-уведомление, когда приложение находится на переднем плане.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
completionHandler([.alert, .badge, .sound])
}
К сожалению, это работает не каждый раз. Независимо от состояния приложения, я получаю обратный вызов по методу didReceiveRemoteNotification. Есть ли какая-то особая причина для такого поведения? Я что-то упускаю?
Заранее спасибо
Ответ №1:
Я думаю, что вы должны использовать userNotificationCenter
с « didReceive response
» подписью вместо application(didReceiveRemoteNotification userInfo:..)
// MARK: Notification handling
// If the app is in the background
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let id = response.notification.request.identifier
print("Received notification with ID = (id)")
completionHandler()
}
// If the app is in the foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let id = notification.request.identifier
print("Received notification with ID = (id)")
completionHandler([.sound, .alert])
}
Кроме того, пусть ваш AppDelegate будет делегатом центра сертификации.
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
UNUserNotificationCenter.current().delegate = self
}
.
.
.
}
Комментарии:
1. Спасибо. Я дважды проверил настройку делегата и обнаружил, что он был установлен не так, как ожидалось. Но меня все еще смущает, почему я получаю обратный вызов метода didReceiveRemoteNotification, даже если делегат не был установлен. Из-за этого я полностью проигнорировал проверку делегата. В любом случае, большое спасибо.