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.Jawaban:
Jadi catatan rilis iOS 11.1 beta 1 katakan
Saya melakukan beberapa tes dan tampaknya memang diperbaiki:
Negara ditangguhkan
Ketika saya meluncurkan aplikasi dalam mode ditangguhkan dan mengirimkan dorongan diam, aplikasi dibawa kembali ke latar belakang dan
didReceiveRemoteNotification:fetchCompletionHandler
delegasi dipanggil.Status latar depan
Dengan cara yang sama, ketika aplikasi berada di latar depan dan dorongan diam dikirim, delegasi tampaknya dipanggil seperti yang diharapkan. Ini secara acak tidak berfungsi di versi iOS 11 sebelumnya jadi saya akan mengkonfirmasi ini setelah pengujian lebih lanjut.
sumber
Hanya ingin menambahkan 2 sen saya di sini karena saya telah terkena masalah ini juga dan saya perhatikan bahwa Apple telah menutup beberapa radar pada masalah ini dengan mengatakan mereka tidak dapat mereproduksi. Suatu hal yang menarik yang saya temukan adalah dorongan akan dikirim jika aplikasi dilatar belakangi sementara itu dilampirkan ke debugger.
Jika saya membunuh debugger, cabut telepon saya, luncurkan aplikasi, dan kirim payload push push saya melihat aplikasi TIDAK dibangunkan. Saya melihat di log Konsol bahwa sistem membatalkan pengiriman muatan ke aplikasi saya.
Saya telah mengirimkan radar dengan aplikasi sampel kecil yang mereproduksi masalah. Saya juga secara eksplisit mencatat di radar bahwa orang yang mengerjakan tiket saya tidak boleh menjalankan aplikasi yang dilampirkan ke debugger untuk mereproduksi masalah. Inilah tautannya: https://bugreport.apple.com/web/?problemID=34461063
Semoga ini akan menyebabkan beberapa kemajuan dibuat pada masalah ini.
sumber
Sepertinya perilaku baru iOS 11. iOS 11 beta 10 menyediakan beberapa log deskriptif mengenai masalah ini:
Sepertinya setiap push diam dikirim ke iOS, tetapi dasd daemon menggunakan beberapa kebijakan untuk memutuskan apakah push diam harus dikirimkan ke aplikasi (mis. Level baterai). Saya berhasil menerima satu dorongan diam kemarin malam, tetapi iPhone saya terhubung ke pengisi daya pada waktu itu - mungkin skor BatteryLevelPolicy cukup tinggi untuk menerima satu dorongan diam itu.
Apple tidak memberikan informasi resmi tentang perilaku sisi iOS ini, hanya ada informasi tentang pelambatan sisi server:
Saya tetap jemari mereka mengubah perilaku itu, karena itu akan memperbaiki aplikasi saya :) Di sisi lain, perubahan ini baik - satu di antara banyak hal yang membuat baterai iPhone lebih tahan lama daripada ponsel Android.
sumber
dasd
Proses kemudian logdefault 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017
. Dorongan bisu tampaknya disampaikan pada saat itu.com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
Catatan rilis beta iOS 11.1 meliputi: Pemberitahuan Masalah Terselesaikan Pemberitahuan push diam diproses lebih sering. (33278611)
sumber
iOS 11.1 Beta 2 juga mengandung
dalam Catatan Rilis - akan mengujinya sekarang.
UPDATE - 11.10.2017 - iOS 11.1 Beta 2
Setelah menggunakan Aplikasi kami selama 2 hari di "skenario dunia nyata", sepertinya ada peningkatan nyata dalam versi iOS ini. Dengan hati-hati saya mulai percaya ini sudah pasti.
sumber
Hubungan Pengembang Apple baru saja menambahkan komentar ke radar saya:
saat ini menginstal iOS 11.2 beta - akan menguji perilaku push push
sumber
Saya memiliki masalah serupa dengan aplikasi saya, sampai iOS 10 saya mendapatkan notifikasi push dan
application:didReceiveRemoteNotification:fetchCompletionHandler
dipanggil dengan benar. Tetapi ketika diperbarui ke iOS 11 pemberitahuan push berhenti berfungsi.Masalah dengan kode saya adalah, meskipun saya menggunakan konten yang tersedia: 1 dan konten yang bisa berubah: 1 di payload pemberitahuan push, opsi Background Fetch tidak dihidupkan. Tapi itu berfungsi dengan baik hingga iOS 10.
Setelah Mengaktifkan Kemampuan Latar Belakang, AKTIF berfungsi sekarang
sumber
iOS 11.4.1, Swift 4
Saya mengalami masalah dengan dorongan diam tidak datang (dari CloudKit) dan saya mencoba semua yang disebutkan semua orang di sini. Kemudian saya memutuskan untuk mencoba mengosongkan objek
alertBody
sayaCKNotificationInfo()
seperti ini:Ini membuat push dikirim pada prioritas yang lebih tinggi (tetapi mereka masih push diam) dan saya tidak lagi mendapatkan kesalahan di log perangkat saya bahwa push itu diabaikan.
Saya harap itu membantu seseorang. :)
sumber
Jadi ini memang bug di iOS 11 dan sekarang sudah diperbaiki di iOS 11 beta 3. The
application:didReceiveRemoteNotification:fetchCompletionHandler
Sekarang disebut dengan benar ketika push silent diterima baik di latar depan atau di latar belakang.MEMPERBARUI
Tidak, itu tidak diperbaiki dan masih terjadi di iOS beta 3 dan 4
sumber
Sebagai solusinya Kami menambahkan kunci "pemberitahuan" dan di dalam "judul" dengan string kosong sebagai nilai. Ini membangunkan panggilan balik didReceive di appDelegate.
sumber
Saat menulis jawaban ini saya menghadapi masalah yang sama persis dengan jawaban Bill Dunay .
Persyaratan saya adalah untuk menerima pemberitahuan diam saat aplikasi di latar depan dan tidak ada saat aplikasi di latar belakang / tidak berjalan. Dan solusi saya adalah ini. Saya tidak menggunakan lencana maka pengaturan ke nol bukan masalah bagi saya.
Harap dicatat bahwa saya sengaja tidak menggunakan "konten yang tersedia". Pengaturan yang menyebabkan logika pengoptimalan iOS mulai menunda / membatalkan pengiriman pemberitahuan.
sumber
Saya telah mendapatkan masalah yang sama untuk beberapa notifikasi (belum tentu diam).
Setelah meninjau semua pembaruan dan jawaban, saya dapat menambahkan dua pembaruan yang dapat membantu:
Saya menemukan bahwa
UIApplication.shared.isRegisteredForRemoteNotifications
metode mengakses saat menerima pemberitahuan menyebabkan aplikasi berhenti tanpa melaporkan apa pun ke Xcode. Periksa apakah Anda menjalankan beberapa kode setelah Anda menerima pemberitahuan yang mengakses metode ini. ( isRegisteredForRemoteNotifications mengunci UI dengan semaphore_wait_trap )."title-loc-args" : [3333]
tidak menerima 3333 secara harfiah tetapi menerimanya sebagai string"title-loc-args" : ["3333"]
. Ini membuat seluruh antarmuka saya terhenti setelah saya mengakses metode di atas, hanya di iOS 11, ia bekerja di iOS 12.Saya juga menemukan bahwa, dengan kode yang sama persis, ia berfungsi tanpa masalah di iOS 12.0 (16A5366a) . Tetapi pada iOS 11 hal itu terjadi.
sumber
Dalam kasus saya, notifikasi diam digunakan untuk memperbarui ui setelah pekerjaan dilakukan di situs server sehingga sangat menyebalkan memiliki konten yang tidak relevan dalam aplikasi. Karena payload kami untuk notifikasi diam berisi judul dan badan yang sama, saya menerapkan metode ini untuk mendapatkan notifikasi yang berfungsi di aplikasi aktif / tidak aktif, tidak mengisi daya dan dengan Background App Refresh dimatikan dan bahkan dalam keadaan Daya Rendah.
Agar ini berfungsi, saya menambahkan delegasi dan membuat ekstensi dengan
UNUserNotificationCenterDelegate
protokol danwillPresent notification
(iOS 10+) metode, yang dipicu setiap kali dengan muatan yang benar. Untuk tidak menampilkan notifikasi ketika aplikasi sedang aktif, cukup panggil penyelesaian dengan lencana atau suara. Saya berakhir dengan sesuatu seperti iniDan untuk mengaktifkan status ini ketika aplikasi di latar belakang dan notifikasi diam-diam jangan panggil metode saya, saya mendapatkan notifikasi dari pusat notifikasi langsung
applicationDidBecomeActive
oleh:sumber
Dalam kasus saya, "Background App Refresh" dimatikan dalam pengaturan iPhone. Karena pemberitahuan push ini dikirimkan ke perangkat tetapi tidak pada aplikasi. Mengaktifkan Aplikasi Latar Belakang. Refresh aktif menerima dorongan diam dalam aplikasi.
Ini mungkin bukan jawaban aktual untuk pertanyaan ini, untuk berjaga-jaga jika ada yang perlu memeriksa.
sumber