didReceiveRemoteNotification não chamado no iOS 13.3 quando o aplicativo está em segundo plano

10

Eu estou batendo minha cabeça. Estou implementando a notificação por push. Tudo está funcionando bem (o envio é recebido, o selo é atualizado), mas no iOS 13.3 o aplicativo de método (_: didReceiveRemoteNotification: fetchCompletionHandler :) não é chamado quando o aplicativo está em segundo plano. Se o aplicativo estiver em primeiro plano ou usando um dispositivo iOS 12, o método será chamado. Registro-me para notificação por push da seguinte maneira:

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

A carga útil está configurada para o seguinte

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

Tentei adicionar "Notificações remotas" e "Processamento em segundo plano" como recursos do aplicativo em todas as variações (apenas "Notificações remotas" / "Processamento em segundo plano", sem nenhum desses recursos, ativando os dois) sem nenhuma alteração. Defino o delegado para o UNUserNotificationCenter, mas novamente sem sucesso. Defino os cabeçalhos de acordo:

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

Nos documentos, ele afirma que esse método é chamado mesmo quando o aplicativo está em segundo plano:

Use este método para processar notificações remotas recebidas para seu aplicativo. Diferente do aplicativo: didReceiveRemoteNotification: method, que é chamado apenas quando o aplicativo está sendo executado em primeiro plano, o sistema chama esse método quando o aplicativo está sendo executado em primeiro plano ou em segundo plano.

O que estou perdendo aqui para o iOS 13?

MartinW1985
fonte
Verifique se você está usando este método: developer.apple.com/documentation/uikit/uiapplicationdelegate/…
11
Veja acima: Tudo está funcionando bem (o envio é recebido, o crachá é atualizado), mas no iOS 13.3 o aplicativo de método (_: didReceiveRemoteNotification: fetchCompletionHandler :) não é chamado quando o aplicativo está em segundo plano.
MartinW1985 23/01
application (_: didReceiveRemoteNotification: fetchCompletionHandler :) será chamado quando você tocar no banner de notificação
Sim isto está correcto. Minha pergunta é: por que não é chamado quando o aplicativo está em segundo plano. Pelo meu entendimento, os documentos dizem isso.
MartinW1985 27/01
Você já tentou implementar o application(_:didReceiveRemoteNotification:withCompletionHandler:)método?
HardikS 27/01

Respostas:

2

Você definiu

"content-available": 1

em seu back-end da carga útil do APS?

Também é necessário ter certeza de que você ativou o modo de segundo plano no arquivo info.plist do seu aplicativo para iOS

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>
Zhang Zhan
fonte
@matt a postagem foi enviada acidentalmente antes de eu digitar todas as respostas. Agora, é concluído com a alteração do lado do aplicativo.
Zhang Zhan
11
Sim eu fiz. Você pode ver na minha solicitação de CURL na minha postagem inicial. Também adicionei "conteúdo disponível": 1 e tentei todos os modos de segundo plano (ativado, desativado, variações), mas ainda o aplicativo (_: didReceiveRemoteNotification: fetchCompletionHandler :) não está sendo chamado. Somente se o aplicativo estiver ativo.
MartinW1985
<string> processing </string> => esta é uma linha importante
Dong Mai
@ZhangZhan: Você já resolveu esse problema? Estou enfrentando o mesmo problema em que as notificações silenciosas / em segundo plano não são recebidas, mesmo quando a chave de conteúdo disponível está definida corretamente. No iOS 12, tudo funciona corretamente, mas no iOS13, apenas as notificações sonoras / visuais estão funcionando. Estou ciente de que a apple exige que um novo tipo de cabeçalho seja incluído na notificação, mas que já está sendo tratado (estamos usando o SNS). Curiosamente, isso não está funcionando no simulador com o arquivo apns com a versão mais recente do XCode.
whawhat 18/04
2

Eu gasto um tíquete de suporte para obter uma resposta para esse problema.

Acontece que a documentação não é 100% "válida" para o iOS 13 neste tópico. O dispositivo decide se deve acordar ou não. Embora a documentação afirme um pouco diferente.

A maneira preferida de implementação da Apple como uma extensão de notificação. Depois disso, você deve adaptar a carga útil para incluir "conteúdo mutável".

Depois, perguntei ao suporte se eu deveria arquivar um radar e eles responderam com "sim".

MartinW1985
fonte
se você fornecer uma extensão de notificação, o aplicativo será ativado?
Peter Lapisu em 30/04
0

Implemente didRegisterForRemoteNotificationsWithDeviceTokene também didFailToRegisterForRemoteNotificationsWithErrorno representante do seu aplicativo, para verificar se o dispositivo faz uma boa conexão com o servidor APN da Apple. Se não for esse o caso, reinicie o dispositivo e / ou tente fazer uma conexão por outra rede Wi-Fi e reinicie o aplicativo.

Ely
fonte
0

Este método de delegação: -

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

está sendo chamado quando clicamos na notificação para iOS 13 e o aplicativo está em segundo plano.

user13150044
fonte
11
Sim, mas eu estava procurando uma maneira de obter a carga útil sem clicar na notificação.
MartinW1985
0

Você precisa implementar uma extensão de conteúdo de notificação

Como eu estava usando o OneSignal e seu código de configuração, isso funcionou bem para mim https://documentation.onesignal.com/docs/ios-sdk-setup

não tenho certeza se os bits do OneSignal fazem diferença, mas anexá-los de qualquer maneira

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)
        }
    }

}
Peter Lapisu
fonte