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


10

나는 머리를 두드리고있다. 푸시 알림을 구현하고 있습니다. 모든 것이 제대로 작동하지만 (푸시가 수신되고 배지가 업데이트 됨) 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에서 여기서 무엇을 놓치고 있습니까?


이 방법을 사용하고 있는지 확인하십시오. developer.apple.com/documentation/uikit/uiapplicationdelegate/…

1
위를 참조하십시오 : 모든 것이 잘 작동하고 (푸시가 수신되고 배지가 업데이트됩니다) iOS 13.3에서는 응용 프로그램이 백그라운드에있을 때 응용 프로그램 (_ : didReceiveRemoteNotification : fetchCompletionHandler :)이 호출되지 않습니다.
MartinW1985

알림 배너를 탭하면 application (_ : didReceiveRemoteNotification : fetchCompletionHandler :)이 호출됩니다

예, 맞습니다. 내 질문은 : 앱이 백그라운드에있을 때 왜 호출되지 않는지입니다. 내 이해에서 문서는 그렇게 말합니다.
MartinW1985

application(_:didReceiveRemoteNotification:withCompletionHandler:)방법 을 구현하여 시도 했습니까 ?
HardikS

답변:


2

설정 했습니까

"content-available": 1

백엔드 APS 페이로드에서

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

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

@ 매트는 모든 답변을 입력하기 전에 실수로 게시물을 제출했습니다. 이제 앱 측 변경으로 완료되었습니다.
장 잔

1
그래, 내가 했어. 초기 게시물의 CURL 요청에서 볼 수 있습니다. 또한 "content-available": 1을 추가하고 모든 백그라운드 모드 (활성화, 비활성화, 변형)를 시도했지만 여전히 application (_ : didReceiveRemoteNotification : fetchCompletionHandler :)이 호출되지 않습니다. 앱이 활성화 된 경우에만.
MartinW1985

<문자열> 처리 </ 문자열> => 이것은 importnant 라인
동 마이

@ZhangZhan :이 문제를 해결 한 적이 있습니까? 콘텐츠 사용 가능 키가 올바르게 설정된 경우에도 자동 / 백그라운드 알림이 수신되지 않는 동일한 문제가 발생합니다. iOS 12에서는 모든 것이 제대로 작동하지만 iOS13에서는 가청 / 시각 알림 만 작동합니다. Apple은 알림에 새 헤더 유형을 포함해야하지만 이미 처리되어 있습니다 (SNS를 사용하고 있음). 흥미롭게도 최신 XCode 버전의 apns 파일이있는 시뮬레이터에서는 작동하지 않습니다.
whawhat

2

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

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

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

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


알림 확장을 제공하면 앱이 깨어 났습니까?
피터 라피 수

0

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


0

이 위임 방법 :-

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

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


1
예,하지만 알림을 클릭하지 않고 페이로드를 얻는 방법을 찾고있었습니다.
MartinW1985

0

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

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

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.