didReceiveRemoteNotification не вызывается в iOS 13.3, когда приложение находится в фоновом режиме - PullRequest
11 голосов
/ 23 января 2020

Я бью себя по голове. Я реализую уведомление pu sh. Все работает нормально (получен pu sh, значок обновлен), но в iOS 13.3 приложение метода (_: didReceiveRemoteNotification: fetchCompletionHandler :) не вызывается, когда приложение находится в фоновом режиме. Если приложение находится на переднем плане или использует устройство iOS 12, вызывается метод. Я регистрируюсь для уведомления pu sh следующим образом:

[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        });
    }
}];

Полезная нагрузка установлена ​​на следующее

{"aps": {
    "badge": 10,
    "alert": "test",
    "content-available": 1
}}

Я попытался добавить «Удаленные уведомления» и «Фоновая обработка» как возможности приложения во всех вариациях (только «Удаленные уведомления» / «Фоновая обработка», без каких-либо из этих возможностей, включающих оба) без каких-либо изменений Я назначил делегата для UNUserNotificationCenter, но снова безуспешно. Я установил соответствующие заголовки:

curl -v \
 -H 'apns-priority: 4' \
 -H 'apns-topic: xx.xxxxx.xxxx' \
 -H 'apns-push-type: alert' \
 -H 'Content-Type: application/json; charset=utf-8' \
 -d '{"aps": {"badge": 10,"alert": "test", "content-available":1}}' \
 --http2 \
 --cert pushcert.pem \
 https://api.sandbox.push.apple.com/3/device/1234567890

Из документов говорится, что этот метод вызывается, даже когда приложение находится в фоновом режиме:

Используйте этот метод для обработки входящих удаленных уведомлений для вашего приложения. В отличие от приложения: didReceiveRemoteNotification: метод, который вызывается только тогда, когда ваше приложение работает на переднем плане, система вызывает этот метод, когда ваше приложение работает на переднем или заднем плане.

Чего мне не хватает здесь для iOS 13?

Ответы [ 5 ]

2 голосов
/ 22 марта 2020

Я трачу билет в службу поддержки, чтобы получить ответ на эту проблему.

Оказывается, что документация не является 100% "действительной" для iOS 13 в этой топи c. Устройство решает, просыпаться или нет. Хотя в документации говорится немного по-другому.

Предпочтительный способ реализации Apple в качестве расширения уведомлений. После этого вы должны адаптировать полезную нагрузку для включения «mutable-content».

Позже я спросил службу поддержки, должен ли я подать радар, и они ответили «да».

2 голосов
/ 05 февраля 2020

Вы установили

"content-available": 1

в своей полезной нагрузке APS бэкэнда?

Также необходимо убедиться, что вы включили фоновый режим в файле info.plist вашего приложения iOS

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>
0 голосов
/ 30 апреля 2020

Вам необходимо реализовать расширение содержимого уведомлений

Поскольку я использовал OneSignal и его установочный код, для меня это работало нормально https://documentation.onesignal.com/docs/ios-sdk-setup

не уверен, если биты OneSignal имеют значение, но все равно добавляют их

import UserNotifications
import OneSignal

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var receivedRequest: UNNotificationRequest!
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.receivedRequest = request;
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

}
0 голосов
/ 30 марта 2020

Этот метод делегата: -

(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler

вызывается, когда мы нажимаем на уведомление для iOS 13 и приложение находится в фоновом режиме.

0 голосов
/ 20 марта 2020

Реализуйте didRegisterForRemoteNotificationsWithDeviceToken, а также didFailToRegisterForRemoteNotificationsWithError в делегате вашего приложения, чтобы проверить, правильно ли устройство подключено к серверу Apple APN. Если это не так, перезапустите устройство и / или попробуйте установить соединение через другую сеть Wi-Fi и перезапустите приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...