Saya perhatikan bahwa di iOS 11 beta 2, notifikasi diam tidak dikirimkan ke application:didReceiveRemoteNotification:fetchCompletionHandler
kondisi aplikasi apa pun (latar belakang / latar depan).
Saya menerapkan UIApplicationDelegete
metode ini application:didReceiveRemoteNotification:fetchCompletionHandler
dan saya mengirim dorongan diam berikut
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
tetapi metode delegasi tidak dipanggil di iOS 11.
Ini berfungsi dengan baik pada versi lain dari iOS dan bagian dokumentasi Mengonfigurasi Pemberitahuan Diam tidak menyebutkan bahwa hal lain harus dilakukan.
Apakah ini bug di iOS 11 atau apakah saya melewatkan sesuatu yang baru di iOS 11?
Harap dicatat bahwa saya tidak berbicara tentang atau menggunakan UserNotification
kerangka kerja yang seharusnya tidak diperlukan untuk mengirim dorongan diam.
Berikut adalah contoh proyek yang menggambarkan masalah ini (Anda harus menetapkan bundel id Anda sendiri)
Saat Anda makan siang proyek sampel dan mengirim muatan di atas ke aplikasi, Anda dapat menggunakan konsol macOS untuk melihat bahwa dorongan dikirim dengan benar ke perangkat tetapi tidak ke aplikasi.
PEMBARUAN 10.08
Tampaknya perilaku itu acak. Kadang-kadang setelah memulai ulang perangkat, payload dikirim dengan benar tetapi berhenti berfungsi setelah beberapa saat.
Seperti yang dapat Anda lihat pada tangkapan layar berikut, dorongan yang ditandai sebagai 1 hanya dikirimkan ke perangkat dan dorongan 2 (setelah perangkat dinyalakan kembali) juga dikirimkan ke aplikasi.
PEMBARUAN 14.08 - iOS 11 Beta 6
Masih perilaku yang sama. Hal lain yang seharusnya berhasil tetapi tidak adalah yang berikut ini. Ketika skema aplikasi diatur ke "Tunggu untuk dieksekusi yang akan diluncurkan", dorongan diam seharusnya membangunkan aplikasi dan memulainya di latar belakang.
UPDATE 21.08 - iOS 11 Beta 7
Masih perilaku yang sama dan bukan pembaruan dari Apple dalam laporan bug.
UPDATE 29.08 - iOS 11 Beta 8
Masih masalah yang sama. Langkah-langkah untuk mereproduksi yang saya gunakan sekarang adalah sebagai berikut:
- Dalam skema proyek Xcode, pilih "Tunggu eksekusi akan diluncurkan"
- Tambahkan breakpoint di
didReceiveRemoteNotification: fetchCompletionHandler
- Mulai aplikasi di perangkat
- Kirim dorongan diam di atas
Diharapkan : Aplikasi ini dibawa dari status ditangguhkan ke latar belakang dan didReceiveRemoteNotification: fetchCompletionHandler
disebut
Sebenarnya : tidak ada yang terjadi
UPDATE 06.09 - iOS 11 Beta 10
Saya masih memiliki perilaku buggy yang sama. Tiket dari Apple telah diperbarui dengan jawaban berikut:
Hubungan Pengembang Apple 6 September 2017, 10:42 PM Engineering telah memberikan umpan balik berikut tentang masalah ini:
Kami bisa menjalankan aplikasi sampel dan menguji perilaku. Kami tidak melihat masalah ketika kami menguji ini seperti yang dijelaskan.
Dorongan tidak dijamin untuk sampai ke aplikasi ketika sedang berjalan di latar belakang, dan log di sini menunjukkan bahwa kami tidak percaya aplikasi tersebut digunakan cukup untuk meluncurkannya.
Kami melihat kami memberikan dorongan dari waktu ke waktu ketika kondisinya baik.
Kami percaya ini berlaku dengan benar.
Perbarui 11.09
Laporan bug Apple saya ditutup dan ditandai sebagai duplikat 33278611
yang tetap terbuka
UPDATE 13.09 - iOS 11 GM
Berkat komentar kam800 (lihat di bawah) saya melakukan lebih banyak pengujian dan menghasilkan pengamatan:
Tampaknya ada daemon baru di iOS 11 dasd DuetActivitySchedulerDaemon
yang membuang sepenuhnya push data atau menunda pengiriman data push:
Pengiriman ditunda
Log Konsol
default 13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>! lifecycle com.apple.duetactivityscheduler
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private> default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017 default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>) scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private> default com.apple.duetactivityscheduler
Masalah pengiriman yang tertunda
- Ketika pengiriman push data ditunda dan aplikasi diluncurkan, push data dikirimkan hanya ketika tanggal pengiriman tercapai yang bisa beberapa menit di masa depan. Ini benar-benar mengalahkan tujuan menggunakan dorongan data untuk menjaga konten aplikasi baru siap untuk peluncuran berikutnya. Saya kutip di sini sekali lagi dokumentasi Apple:
"Notifikasi diam meningkatkan pengalaman pengguna dengan membantu Anda memperbarui aplikasi, bahkan saat aplikasi tidak berjalan."
- Ketika dua dorongan data dikirim ke aplikasi yang ditangguhkan mereka ditunda oleh iOS 11 alih-alih membangunkan aplikasi secara langsung. Ketika waktu pengiriman tercapai, hanya dorongan data terakhir yang dikirimkan! Dorongan sebelumnya hilang dan tidak dikirimkan melalui metode delegasi yang mengakibatkan hilangnya data.
Pengiriman dibatalkan
Log Konsol
default 13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
], FinalDecision: Must Not Proceed} scoring com.apple.duetactivityscheduler
Masalah pengiriman yang dibatalkan
Nah dalam hal ini, dorongan data benar-benar hilang dan tidak pernah dikirim di iOS 11 saat itu disampaikan dengan benar di iOS 10.
UPDATE 19.09 - iOS 11 GM
Saya juga memperhatikan bahwa ketika aplikasi berada di latar depan dan notifikasi tidak dikirimkan ke aplikasi, saya melihat log berikut di konsol:
default 08:28:49.354824 +0200 apsd apsd <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO courier-oversized com.apple.apsd
fault 08:33:18.128209 +0200 dasd Foundation <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'. general com.apple.foundation.xpc
"content-available": 1
, dan aplikasi di latar depan, panggilan balik tidak akan dipecat.