Swift: получение данных из удаленного уведомления
У меня есть приложение для обмена сообщениями, которое получает данные с сервера посредством push-уведомлений. На следующем рисунке вы можете увидеть процесс, а также проверить, где он вышел из строя:
Я много исследовал эту проблему, но не нашел универсального решения.
Одно решение, которое я получаю, - это использовать молчаливое уведомление, обсужденное здесь, чтобы получить данные до их отображения и сохранить Но я не нашел, как показать уведомление от делегата приложения, как только я получил молчаливое уведомление.
Пожалуйста, поправьте меня, если я где-то концептуально ошибаюсь.
Обновление: одна из проблем заключается в том, что приложение: didReceiveRemoteNotification: fetchCompletionHandler: вызывается только тогда, когда
- приложение находится на переднем плане
- пользователь нажимает на уведомление
Но когда пользователь не щелкает уведомление, приложение: didReceiveRemoteNotification: fetchCompletionHandler: не вызывается, и я не могу найти способ сохранить данные, присутствующие в уведомлении.
2 ответа
Есть буксировщики, 1) Фон 2) Закрытое состояние
Если приложение находится в Background State
, вы должны включить Background Fetch
, тогда этот метод будет вызываться, когда приложение находится в фоновом режиме application:didReceiveRemoteNotification:fetchCompletionHandler:
Когда приложение closed
или же killed
пользователем вышеописанный метод не сработает, для этого вы можете использовать VoIP
техника.
didReceiveIncomingPushWithPayload
метод будет вызываться всякий раз, когда приходит удаленное уведомление
Ваш вопрос: "Получить данные из удаленных уведомлений, когда приложение находится на переднем плане", если я не ошибаюсь, вы можете использовать эти два метода для получения данных из удаленных уведомлений в фоновом и переднем режимах приложений.
// Notification will present call back
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .sound, .badge])
// Handle your data here
print("Notification data: \(notification.request.content.userInfo)")
}
@available(iOS 10.0, *)
// Notification interaction response call back
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
// Handle your data here
print("Notification data: \(response.notification.request.content.userInfo)")
}