アプリがバックグラウンドにあるときに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では、アプリがバックグラウンドにある場合、メソッドapplication(_: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>

@mattすべての回答を入力する前に、誤って投稿が送信されました。これでアプリ側の変更が完了しました。
Zhang Zhan

1
はい、そうしました。あなたは私の最初の投稿で私のCURLリクエストから見ることができます。また、 "content-available":1を追加し、すべてのバックグラウンドモード(有効、無効、バリエーション)を試しましたが、それでもapplication(_:didReceiveRemoteNotification:fetchCompletionHandler :)が呼び出されません。アプリがアクティブな場合のみ。
MartinW1985

<string> processing </ string> =>これは重要な行です
ドンマイ

@ZhangZhan:この問題を解決したことがありますか?content-availableキーが正しく設定されていても、サイレント/バックグラウンド通知が受信されないという同じ問題が発生しています。iOS 12ではすべてが適切に機能しますが、iOS13では可聴/視覚通知のみが機能します。Appleは新しいヘッダータイプを通知に含める必要があることを承知していますが、それはすでに処理されています(SNSを使用しています)。興味深いことに、これはシミュレーターで最新のXCodeバージョンのapnsファイルを使用すると機能しません。
whawhat

2

この問題の答えを得るためにサポートチケットを使います。

このトピックに関するiOS 13のドキュメントは100%「有効」ではないことがわかりました。デバイスは、ウェイクアップするかどうかを決定します。ドキュメントでは少し異なりますが。

通知拡張機能としてAppleが推奨する実装方法。その後、「mutable-content」を含むようにペイロードを調整する必要があります。

後でレーダーに報告するかどうかをサポートに尋ねたところ、「はい」と回答しました。


通知拡張機能を提供すると、アプリは起動しますか?
Peter Lapisu

0

アプリのデリゲートに実装didRegisterForRemoteNotificationsWithDeviceTokendidFailToRegisterForRemoteNotificationsWithError、デバイスがAppleのAPNサーバーと適切に接続しているかどうかを確認します。そうでない場合は、デバイスを再起動するか、別の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.