didReceiveRemoteNotification tidak dipanggil di iOS 13.3 saat aplikasi di latar belakang


10

Saya membenturkan kepala. Saya menerapkan pemberitahuan push. Semuanya berfungsi dengan baik (push diterima, lencana diperbarui) tetapi di bawah iOS 13.3 aplikasi metode (_: didReceiveRemoteNotification: fetchCompletionHandler :) tidak dipanggil saat aplikasi berada di latar belakang. Jika aplikasi di latar depan atau menggunakan perangkat iOS 12 metode ini disebut. Saya mendaftar untuk pemberitahuan push dengan cara berikut:

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

Payload diatur sebagai berikut

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

Saya mencoba menambahkan "Pemberitahuan jarak jauh" dan "Pemrosesan latar belakang" sebagai kemampuan aplikasi dalam semua variasi (hanya "Pemberitahuan jarak jauh" / "Pemrosesan latar belakang", tanpa kemampuan apa pun, yang memungkinkan keduanya) tanpa perubahan apa pun. Saya menetapkan delegasi untuk UNUserNotificationCenter tetapi sekali lagi tidak berhasil. Saya mengatur tajuk sesuai:

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

Dari dokumen itu menyatakan bahwa metode ini dipanggil bahkan ketika aplikasi di latar belakang:

Gunakan metode ini untuk memproses notifikasi jarak jauh yang masuk untuk aplikasi Anda. Berbeda dengan aplikasi: metode didReceiveRemoteNotification:, yang dipanggil hanya ketika aplikasi Anda berjalan di latar depan, sistem memanggil metode ini ketika aplikasi Anda berjalan di latar depan atau latar belakang.

Apa yang saya lewatkan di sini untuk iOS 13?


Periksa apakah Anda menggunakan metode ini: developer.apple.com/documentation/uikit/uiapplicationdelegate/…

1
Silakan lihat di atas: Semuanya berfungsi dengan baik (push diterima, lencana diperbarui) tetapi di bawah iOS 13.3 aplikasi metode (_: didReceiveRemoteNotification: fetchCompletionHandler :) tidak dipanggil ketika aplikasi berada di latar belakang.
MartinW1985

application (_: didReceiveRemoteNotification: fetchCompletionHandler :) akan dipanggil ketika Anda mengetuk spanduk notifikasi

Ya ini benar. Pertanyaan saya adalah: Mengapa tidak dipanggil saat aplikasi di latar belakang. Dari pemahaman saya, para dokter mengatakan demikian.
MartinW1985

Sudahkah Anda mencoba dengan menerapkan application(_:didReceiveRemoteNotification:withCompletionHandler:)metode?
HardikS

Jawaban:


2

Sudahkah Anda mengatur

"content-available": 1

di backend Anda APS payload?

Juga perlu memastikan Anda telah mengaktifkan mode latar belakang dalam file info.plist Aplikasi iOS Anda

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

@matt posting tidak sengaja dikirim sebelum saya mengetikkan semua jawaban. Sekarang ini selesai dengan perubahan sisi aplikasi.
Zhang Zhan

1
Ya saya lakukan. Anda dapat melihat dari permintaan CURL saya di posting awal saya. Saya juga menambahkan "konten-tersedia": 1 dan mencoba semua mode latar belakang (diaktifkan, dinonaktifkan, variasi) tetapi masih aplikasi (_: didReceiveRemoteNotification: fetchCompletionHandler :) tidak dipanggil. Hanya jika aplikasi aktif.
MartinW1985

<string> pemrosesan </string> => ini adalah jalur yang penting
Dong Mai

@ZangZhan: Apakah Anda pernah memecahkan masalah ini? Saya mengalami masalah yang sama di mana notifikasi diam / latar belakang tidak diterima bahkan ketika kunci konten yang tersedia diatur dengan benar. Di iOS 12, semuanya berfungsi dengan baik tetapi di iOS13, hanya pemberitahuan suara / visual yang berfungsi. Saya sadar bahwa apel memerlukan jenis tajuk baru untuk dimasukkan dalam pemberitahuan tetapi sudah ditangani (kami menggunakan SNS). Menariknya, ini tidak berfungsi dalam simulator dengan file apns dengan versi XCode terbaru.
whawhat

2

Saya menghabiskan tiket dukungan untuk mendapatkan jawaban atas masalah ini.

Ternyata dokumentasinya tidak 100% "valid" untuk iOS 13 tentang topik ini. Perangkat memutuskan apakah akan bangun atau tidak. Meskipun dokumentasinya sedikit berbeda.

Cara implementasi yang disukai Apple sebagai ekstensi pemberitahuan. Setelah itu, Anda harus menyesuaikan muatan untuk memasukkan "konten yang bisa diubah".

Saya meminta dukungan sesudahnya apakah saya harus mengajukan radar dan mereka menjawab dengan "ya".


jika Anda memberikan ekstensi pemberitahuan, apakah aplikasi dibangunkan?
Peter Lapisu

0

Terapkan didRegisterForRemoteNotificationsWithDeviceTokendan juga didFailToRegisterForRemoteNotificationsWithErrordalam delegasi aplikasi Anda, untuk memeriksa apakah perangkat membuat koneksi yang baik dengan server APN Apple. Jika ini bukan masalahnya, hidupkan ulang perangkat dan / atau coba buat koneksi melalui jaringan Wi-Fi lain dan mulai ulang aplikasi.


0

Metode delegasi ini: -

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

semakin dipanggil ketika kami mengklik pemberitahuan untuk iOS 13 dan aplikasi di latar belakang.


1
Ya, tapi saya sedang mencari cara untuk mendapatkan payload tanpa mengklik notifikasi.
MartinW1985

0

Anda perlu menerapkan Ekstensi Konten Pemberitahuan

Karena saya menggunakan OneSignal dan kode pengaturannya, ini berfungsi dengan baik untuk saya https://documentation.onesignal.com/docs/ios-sdk-setup

tidak yakin apakah bit OneSignal membuat perbedaan, tetapi menambahkannya pula

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

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.