[ios] 앱이 백그라운드에있을 때 iOS 13.3에서 didReceiveRemoteNotification이 호출되지 않음

나는 머리를 두드리고있다. 푸시 알림을 구현하고 있습니다. 모든 것이 제대로 작동하지만 (푸시가 수신되고 배지가 업데이트 됨) iOS 13.3에서는 응용 프로그램이 백그라운드에있을 때 application (_ : didReceiveRemoteNotification : fetchCompletionHandler 🙂 메소드가 호출되지 않습니다. 앱이 포 그라운드에 있거나 iOS 12 디바이스를 사용하는 경우 메소드가 호출됩니다. 다음과 같은 방법으로 푸시 알림을 등록합니다.

[[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

문서에서 앱이 백그라운드에있는 경우 에도이 메소드가 호출된다는 것을 나타냅니다.

이 방법을 사용하여 앱에 대한 수신 원격 알림을 처리하십시오. 앱이 포 그라운드에서 실행될 때만 호출되는 application : didReceiveRemoteNotification : 메소드와 달리 시스템은 앱이 포 그라운드 또는 백그라운드에서 실행될 때이 메소드를 호출합니다.

iOS 13에서 여기서 무엇을 놓치고 있습니까?



답변

설정 했습니까

"content-available": 1

백엔드 APS 페이로드에서

또한 iOS 앱의 info.plist 파일에서 백그라운드 모드를 활성화해야합니다

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>


답변

이 문제에 대한 답변을 얻기 위해 지원 티켓을 사용합니다.

이 주제에 대한 문서가 iOS 13에 대해 100 % “유효하지 않음”으로 밝혀졌습니다. 장치가 깨 울지 여부를 결정합니다. 설명서에 약간의 내용이 있지만.

알림 확장으로 Apple이 선호하는 구현 방식. 그런 다음 “변경 가능 컨텐츠”를 포함하도록 페이로드를 조정해야합니다.

나중에 레이더를 제출해야하는지 지원팀에 요청한 후 “예”라고 답했습니다.


답변

기기가 Apple의 APN 서버와 제대로 연결되어 있는지 확인하기 위해 앱 대리인을 구현 didRegisterForRemoteNotificationsWithDeviceToken하고 실행 didFailToRegisterForRemoteNotificationsWithError하십시오. 그렇지 않은 경우 장치를 다시 시작하거나 다른 Wi-Fi 네트워크를 통해 연결을 시도하고 앱을 다시 시작하십시오.


답변

이 위임 방법 :-

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

iOS 13에 대한 알림을 클릭하면 앱이 호출되고 앱이 백그라운드에 있습니다.


답변

알림 컨텐츠 확장을 구현해야합니다.

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

}


답변