Dorongan diam tidak dikirim ke aplikasi di iOS 11


168

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 UIApplicationDelegetemetode ini application:didReceiveRemoteNotification:fetchCompletionHandlerdan 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 UserNotificationkerangka 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.

masukkan deskripsi gambar di sini

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.

masukkan deskripsi gambar di sini

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: fetchCompletionHandlerdisebut

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 33278611yang 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 DuetActivitySchedulerDaemonyang 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

1
masih belum diperbaiki dalam Beta 8, ketika saya melihat di konsol saya melihat kesalahan berikut: <NSXPCConnection: 0x123f43620> koneksi dari pid 58: Pengecualian tertangkap saat mendekode pesan yang diterima, menjatuhkan pesan yang masuk. Pengecualian: Pengecualian saat mendekode argumen 0 (# 2 dari doa): Pengecualian: nilai untuk kunci 'NS.objects' berasal dari kelas 'NSNull' yang tidak terduga. Kelas yang diizinkan adalah '{(NWParameters, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDictionary, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}'.
Thomas Einwaller

2
Saya mendapatkan hasil yang sama dengan iOS 11 (bukan sebelumnya), jika saya mengirim dengan dorongan "content-available": 1, dan aplikasi di latar depan, panggilan balik tidak akan dipecat.
GoRoS

4
Setelah pengujian dengan iOS11.1 beta 1 yang baru, tampaknya ini telah diperbaiki sekarang dan berfungsi seperti sebelumnya di iOS 10
Lee

3
Whatsapp tampaknya memiliki masalah serupa whatsappen.com/news/5465/... Sesuatu tentang pengguna yang "biasanya memaksa menutup aplikasi mereka" yang merupakan sebagian besar pengembang ...
toxaq

3
Dan persis sama dengan rilis publik 11.1. Jika Anda menggunakan dorongan diam dan aplikasi Anda ada di latar depan, jangan berharap itu akan dikirim tergantung pada beberapa hal, tetapi terutama tingkat baterai, bahkan jika perangkat terhubung ke catu daya.
Gruntcakes

Jawaban:


31

Jadi catatan rilis iOS 11.1 beta 1 katakan

iOS 11.1 beta 1 baru saja dirilis dan mereka menyebutkan: "Pemberitahuan Masalah Terselesaikan • Pemberitahuan push diam diproses lebih sering. (33278611)

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.


3
Pada tes awal saya, saya pikir itu sudah diperbaiki. Itu bekerja sebentar. Tetapi setelah beberapa pengujian berat, hal-hal mulai jatuh sebagian. Tiba-tiba berhenti memanggil delegasi untuk setiap dorongan diam, bahkan dengan aplikasi di latar depan. Rupanya, sistem "duet" baru ini memblokir delegasi aplikasi saya untuk dipanggil karena kurangnya "energyBudget". Jadi, sayangnya, masih belum diperbaiki.
Abras

:( luar biasa:
Thomas Einwaller

Pengalaman saya sama dengan Abras di atas. Bekerja untuk sementara waktu kemudian berantakan dan pawang tidak lagi dipanggil - ini menyebalkan,
Lee

Setelah pengujian lebih lanjut, saya dapat menemukan cara untuk membuat perangkat menerima pemberitahuan lagi. Hubungkan ke daya. Segera setelah Anda menghubungkan perangkat ke daya, itu akan mulai menerima semua Pemberitahuan Remote lagi. Jika Anda memutuskannya, maka itu berhenti. Ini tidak masuk akal, karena dalam semua pengujian saya aplikasi berada di latar depan. Dan aplikasi latar depan dijamin untuk menerima Pemberitahuan Jarak Jauh.
Abras

bagi saya itu semua bekerja dengan baik bahkan ketika pada koneksi seluler tanpa terhubung ke daya. Hanya ketika saya mengatur perangkat ke mode hemat daya maka saya tidak mendapatkan dorongan bahkan ketika di latar depan. Tapi itu sesuatu yang aku mengerti
Jan

18

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.


2
Terima kasih atas laporannya. Btw, yang menghubungkan bug Apple tidak akan membantu di sini karena mereka pribadi dan hanya wartawan dan Apple dapat melihat mereka
Jan

Saya ingin melihat lebih banyak orang menggunakan openradar.appspot.com sehingga kami dapat melacak radar orang lain
Thomas Einwaller

apakah ada pembaruan pada laporan bug Anda dengan apple
@bill

Saya belum mendapatkan pembaruan pada radar saya dari Apple tetapi kami telah menginstal beta iOS 11.1 dan tampaknya masalah telah diperbaiki.
Bill Dunay

Ya, kami juga menghadapi masalah yang sama di iOS 11.2.6, Ada solusi atau pembaruan?
Gopik

14

Sepertinya perilaku baru iOS 11. iOS 11 beta 10 menyediakan beberapa log deskriptif mengenai masalah ini:

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

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:

Notifikasi diam tidak dimaksudkan sebagai cara untuk membuat aplikasi Anda tetap aktif di latar belakang, juga tidak dimaksudkan untuk pembaruan prioritas tinggi. APN memperlakukan pemberitahuan hening sebagai prioritas rendah dan dapat memperlambat pengiriman mereka sepenuhnya jika jumlah totalnya menjadi berlebihan. Batas aktual adalah dinamis dan dapat berubah berdasarkan kondisi, tetapi cobalah untuk tidak mengirim lebih dari beberapa notifikasi per jam.

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.


1
Ya dorongan dikirim ke perangkat tetapi tidak ke aplikasi. Itulah yang saya tulis di posting asli saya. "Pemberitahuan diam tidak dimaksudkan sebagai cara untuk menjaga aplikasi Anda tetap aktif di latar belakang" ini boleh saja asalkan disampaikan "kadang-kadang". Masalah besar adalah bahwa notifikasi diam tidak pernah dikirimkan ke aplikasi di iOS 11 ketika itu di latar belakang. Ini benar-benar mengalahkan seluruh tujuan data push.
Jan

Ya, Anda sudah menulis itu, saya hanya ingin memberikan penjelasan lengkap tentang kebijakan push baru ini. Saya mengutip dokumen Apple untuk menunjukkan bahwa mereka sudah memperingatkan tentang ketidakpastian pengiriman push. Seperti yang saya tulis: "Saya berhasil menerima satu dorongan diam kemarin malam" (dalam aplikasi yang saya maksud), dan aplikasi itu di latar belakang. Tetapi pada hari itu - aplikasi saya tidak menerima dorongan :( Menurut pendapat saya Apple akan melonggarkan kebijakan-push ini dalam versi RC. Di sisi lain, mereka dapat mengembalikan perilaku dorongan asli - mereka sudah terbiasa membuang fitur yang disediakan hanya di versi beta (mis. 10.3 keychain autodelete)
kam800

Saya melihat log serupa ketika push diterima dan aplikasi ditangguhkan. The dasd Proses kemudian log default 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.
Jan

sudah mulai menguji dengan iOS 11 GM, masih melihat perilaku aneh, log suka com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
Thomas Einwaller

1
Juga - Saya berhasil menyelesaikan aplikasi saya dengan mengirimkan push non-silent dengan beberapa pemberitahuan rintisan, dan mengisi notifikasi dengan konten yang tepat menggunakan Notification Service Extension.
kam800

9

Catatan rilis beta iOS 11.1 meliputi: Pemberitahuan Masalah Terselesaikan Pemberitahuan push diam diproses lebih sering. (33278611)


7

iOS 11.1 Beta 2 juga mengandung

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

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.


1
Saya menguji berbagai skenario: Ia bekerja di latar depan dan latar belakang. Sayangnya itu tidak berfungsi, jika aplikasi dihentikan oleh pengguna. Setelah mengakhiri perangkat tidak menerima dorongan diam apa pun, selama aplikasi tidak aktif diluncurkan lagi oleh pengguna. Apakah Anda mengalami hal yang sama?
AlexWoe89

sekarang berfungsi ... setelah 'downtime' kira-kira. 5 hingga 10 menit notifikasi diam berfungsi seperti yang diharapkan ... maaf untuk saya sebelumnya. komentar :)
AlexWoe89

1
desakan sunyi tidak pernah berfungsi ketika pengguna menghentikan aplikasi - lihat developer.apple.com/documentation/uikit/uiapplicationdelegate/... "Namun, sistem tidak secara otomatis meluncurkan aplikasi Anda jika pengguna telah menghentikannya secara paksa."
Thomas Einwaller

1
Saya melihat bahwa iOS11.1 beta 3 berfungsi seperti halnya iOS10 dan jauh lebih baik daripada iOS11.1 beta 2.
Lee

1
@Olecramoak untuk saya iOS11.1 beta 4 bekerja seperti iOS 10.
AlexWoe89

7

Hubungan Pengembang Apple baru saja menambahkan komentar ke radar saya:

Kami percaya masalah ini diselesaikan dalam iOS 11.2 beta terbaru.

Silakan uji dengan iOS beta terbaru. Jika Anda masih memiliki masalah, harap perbarui laporan bug Anda dengan log atau informasi yang relevan yang dapat membantu kami menyelidiki.

https://developer.apple.com/download/

saat ini menginstal iOS 11.2 beta - akan menguji perilaku push push


Jadi apakah ini berarti iOS 11.1 GM tidak akan memperbaiki masalah? :(
Olecramoak

Itu bagus untuk didengar, kapan kita benar-benar mengharapkan rilis resmi iOS11.1?
AlexWoe89

Buat kami tetap diposting, saat ini tidak dapat menginstal aplikasi saya karena tidak ada Xcode untuk 11.2 tersedia. (dan saya menghapus aplikasi dari perangkat saya)
Rool Paap

3

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.

Pastikan Anda mengaktifkan kedua kemampuan ini.

Setelah Mengaktifkan Kemampuan Latar Belakang, AKTIF berfungsi sekarang


tidak, itu tidak berfungsi untuk iOS11 - cukup hentikan aplikasi Anda satu kali, lalu berhenti membangunkan aplikasi Anda. baca saja jawaban dan komentar dalam topik ini
AlexWoe89

2
Untuk aplikasi yang dihentikan, setiap pemberitahuan push (tekanan atau dorongan umum) tidak akan memecat metode delegasi dalam delegasi aplikasi. itulah perilaku default. Tidak ada kasus khusus untuk iOS 11.0.
Sudeep george

3

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 alertBodysaya CKNotificationInfo()seperti ini:

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

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. :)


Bekerja untuk saya dengan CloudKit juga. Tanpa alertBody, Anda harus mencolokkan perangkat untuk mendapatkan remoteNotification. Perilaku yang sangat aneh ...
powertoold

2

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


1
Sebenarnya bukan :( Ini masih terjadi di iOS 11 beta 3
Jan

1
Apple membuka kembali laporan bug juga. Saya akan memberi tahu Anda
Jan

1
Saya tidak menerima dorongan diam di iOS 11 beta 4. Yang lebih memprihatinkan, jika aplikasi tidak ada di latar depan maka terkadang muncul sebagai pemberitahuan biasa. Pasti ada sesuatu!
Ben Dodson

1
Jadi saya baru saja menginstal iOS 11 beta 5 dan terlihat lebih baik dan notifikasi diam-diam dikirim ketika aplikasi berada di latar depan atau latar belakang melalui delegasi didReceiveRemoteNotification untuk sementara waktu kemudian berhenti bekerja lagi apa pun yang saya lakukan: / Apakah Anda memiliki perilaku yang sama?
Jan

1
itu akan keren jika Anda menguji dan ini membuat saya sakit kepala. Dorongan diam dilakukan atau tidak bekerja secara acak setelah memulai ulang perangkat. Aku diperbaharui posting asli saya dengan proyek sampel sehingga kita semua menggunakan sama
Jan

2

Sebagai solusinya Kami menambahkan kunci "pemberitahuan" dan di dalam "judul" dengan string kosong sebagai nilai. Ini membangunkan panggilan balik didReceive di appDelegate.


1
Ini sepertinya bekerja untuk saya dan juga solusi untuk mendapatkan DuetActivitySchedulerDaemon untuk memungkinkan notifikasi membangunkan aplikasi, sampai apple memperbaiki bug.
Joe Benton

Saat mendorong JSON yang berisi judul kosong, saya masih mendapatkan pesan di konsol "Mengabaikan pemberitahuan tanpa peringatan, suara, atau lencana ..." {"aps": {"alert": {"alert": {"title": ""}, "content-available": "1"}, "gcm.message_id": "0 ... bb"} Apakah struktur JSON ini berfungsi untuk Anda?
Olecramoak

bukankah seharusnya Anda mengirim 1 (nilai untuk konten tersedia) tanpa penawaran?
elkorb

Begitulah cara Google Firebase memformat Json (“1”) dan selalu berhasil. Hanya iOS 11 dengan dasd omong kosong yang membuat masalah. Bisakah Anda memposting contoh Json yang berfungsi untuk Anda?
Olecramoak

Jadi apa yang saya amati di iOS 11.1 adalah bahwa dorongan diam tidak terkirim jika perangkat beroperasi pada baterai (tidak mengisi daya) dan tingkat baterai kurang dari 20%, bahkan ketika mode energi rendah TIDAK diaktifkan. Ini buruk. Dorongan diam di iOS 11 sama sekali tidak dapat diandalkan, hampir tidak berguna.
Olecramoak

1

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.

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

Harap dicatat bahwa saya sengaja tidak menggunakan "konten yang tersedia". Pengaturan yang menyebabkan logika pengoptimalan iOS mulai menunda / membatalkan pengiriman pemberitahuan.


1

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.isRegisteredForRemoteNotificationsmetode 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 ).

    • Saya menemukan bahwa saya memiliki kesalahan parsing pemberitahuan push pada konsol karena "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.


1

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 UNUserNotificationCenterDelegateprotokol dan willPresent 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 ini

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

Dan untuk mengaktifkan status ini ketika aplikasi di latar belakang dan notifikasi diam-diam jangan panggil metode saya, saya mendapatkan notifikasi dari pusat notifikasi langsung applicationDidBecomeActiveoleh:

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

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.

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.