Pemberitahuan Push Jarak Jauh macOS Tidak Menampilkan Spanduk Peringatan

Saya mencoba mengaktifkan Pemberitahuan Push untuk aplikasi macOS saya. Segalanya tampak berfungsi. Saya bisa mendapatkan token perangkat. Kirim pemberitahuan tanpa kesalahan. Kecuali tidak ada peringatan yang muncul di Mac saya.

Saya menambahkan kode berikut untuk melihat apakah aplikasi saya menerimanya atau tidak.

func application(_ application: NSApplication, didReceiveRemoteNotification userInfo: [String : Any]) {
    print(userInfo)
}

Dan setelah saya mengirim notifikasi saya melihat yang berikut di konsol.

["aps": {
    alert = "Alert - Hello World";
    sound = "ping.aiff";
}]

Jadi sepertinya perangkatnya baik-baik saja, hanya saja tidak menampilkan peringatan.

Saya telah menguji pengaturan yang sama persis di iOS dan berfungsi dengan baik serta menampilkan peringatan di sana. Jadi saya pasti melewatkan sesuatu yang spesifik di macOS.

Saya telah mencoba hal-hal berikut untuk memperbaikinya:

  1. Diuji dengan aplikasi tertutup dan terbuka (tidak berfungsi juga)
  2. Memastikan notifikasi diaktifkan untuk aplikasi di System Preferences

Gambar Preferensi Sistem

  1. Jika saya membuat notifikasi lokal secara manual dalam kode, itu berfungsi dengan sempurna, dan spanduk notifikasi muncul
  2. Saya tidak dapat mengujinya di macOS versi lama karena API pemberitahuan push yang saya gunakan baru saja dirilis di macOS Mojave
  3. Saya juga mencoba membuat proyek pengujian lain, dan masalah yang sama terjadi
  4. Saya telah memastikan bahwa Jangan Ganggu dimatikan, dan juga telah memeriksa di pusat notifikasi untuk notifikasi tersebut, tetapi tidak muncul juga di sana.

Bagaimana saya bisa menampilkan spanduk dan memutar suara di macOS?


person Charlie Fish    schedule 03.11.2018    source sumber
comment
Saya tahu Anda sudah menentukan ini dalam jawaban Anda, tetapi saya tidak melihatnya, jadi saya pikir ini mungkin membantu beberapa orang untuk melihat gambar ini. ![masukkan deskripsi gambar di sini](i.stack.imgur.com/3cC1S.png)   -  person ScottyBlades    schedule 21.03.2019


Jawaban (2)


Di iOS, kode berikut berfungsi dengan baik:

UNUserNotificationCenter.current().requestAuthorization(options: options) { granted, _ in
    guard granted else { return }

    DispatchQueue.main.async {
        application.registerForRemoteNotifications()
    }
}

Untuk macOS saya mengubah kode itu menjadi:

UNUserNotificationCenter.current().requestAuthorization(options: options) { granted, _ in
    guard granted else { return }

    DispatchQueue.main.async {
        NSApplication.shared.registerForRemoteNotifications()
    }
}

Ternyata baris NSApplication.shared.registerForRemoteNotifications() salah. Di macOS Anda harus memberikan opsi yang sama dengan yang Anda berikan pada panggilan ini.

Mengubah baris itu ke baris berikut berhasil.

NSApplication.shared.registerForRemoteNotifications(matching: [.alert, .sound, .badge])

Yang menurut saya aneh adalah di dokumentasi Apple dikatakan bahwa metode tersebut adalah tidak digunakan lagi, dan kita harus menggunakan registerForRemoteNotifications() sebagai gantinya. Yang membuat saya berpikir ada beberapa jenis bug dengan registerForRemoteNotifications() di mana notifikasi tidak muncul dengan benar.

Satu hal lagi yang perlu disebutkan. Memang memerlukan sedikit waktu (beberapa menit), dan beberapa notifikasi terkirim, agar notifikasi tersebut benar-benar muncul setelah melakukan perubahan tersebut. Tidak yakin apakah itu hanya karena koneksi internet yang lambat atau apa. Tapi sekarang mereka muncul dengan sangat cepat setelah dikirim.


Edit

Apple telah memberi tahu saya bahwa ini telah diperbaiki di macOS 10.14.4. Saya belum bisa mengupgrade ke yang terbaik dan mengujinya. Jadi saya belum bisa memastikannya saat ini. Saya akan memperbarui ini ketika saya mendapat kesempatan untuk menguji di macOS 10.14.4.

person Charlie Fish    schedule 04.11.2018
comment
› Yang membuat saya berpikir ada beberapa jenis bug pada registerForRemoteNotifications() yang membuat notifikasi tidak muncul dengan benar. Saya setuju - person erkanyildiz; 08.11.2018
comment
@erkanyildiz Apakah Anda mengalami masalah yang sama? - person Charlie Fish; 08.11.2018
comment
Ya. Memanggil requestAuthorization di UNUserNotificationCenter lalu menelepon registerForRemoteNotifications tidak berhasil. Meskipun aplikasi muncul di panel Preferensi Pemberitahuan macOS dengan opsi Badges, Sounds, Banners, pemberitahuan tidak ditampilkan. Hanya ketika saya menggunakan metode registerForRemoteNotificationTypes itu berhasil. - person erkanyildiz; 09.11.2018

Klarifikasi, ini adalah macOS, dan NSApp hanyalah NSApplication.shared

Sebenarnya saya harus mengubah jawaban saya karena saya mendapatkan beberapa hasil yang tidak konsisten, jadi saat ini saya sudah melakukannya

if #available(OSX 10.14, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] (success, error) in
        if let error = error {
        // LOG
        } else {
            NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound])
            UNUserNotificationCenter.current().setNotificationCategories(varWithMyCategories)
        }
    }
} else {
    NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound])
}
person fernandomorgan    schedule 14.02.2019
comment
NSApp adalah NSapplication.shared: developer.apple.com/documentation/appkit/nsapp - person fernandomorgan; 15.02.2019
comment
dan dokumen untuk NSApp.registerForRemoteNotifications() ada di sini: developer. apple.com/documentation/appkit/nsipplication/ - person fernandomorgan; 15.02.2019
comment
Anda biasanya harus memberikan kode yang berfungsi. Hanya mengatakan NSApp tidak akan dapat dikompilasi. Juga NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound]) bahkan bukan metode di macOS. registerForRemoteNotifications tidak menerima parameter apa pun di macOS. Apakah Anda membaca jawaban saya? Apakah ada masalah dengan jawaban saya? Menurut bug yang saya ajukan ke Apple, ini telah diperbaiki di macOS 10.14.4. Saya belum punya waktu untuk mengupgrade dan mengujinya. - person Charlie Fish; 16.02.2019
comment
NSApp melakukan kompilasi. Ini ada di macOS sejak 10.0: macOS 10.0+ registerForRemoteNotifications(matching: [.alert, .badge, .sound]) adalah developer.apple.com/documentation /appkit/nsipplication/ dan tersedia sejak macOS 10.7 dan tidak digunakan lagi di 10.14 Mojave - harap cari dokumentasi Mac sebelum berkomentar. - person fernandomorgan; 19.02.2019
comment
Bagus. Kamu masih belum menjawab satupun pertanyaanku. Dan saya tidak yakin mengapa Anda menyarankan untuk menggunakan metode yang tidak digunakan lagi... - person Charlie Fish; 19.02.2019
comment
itu sudah tidak digunakan lagi tetapi berfungsi di 10.14.3. Saya awalnya hanya menggunakan metode NSUserNotification yang lama (karena aplikasi saya mendukung 10.11 dan yang lebih baru) tetapi menambahkan opsi 10.14 karena dukungan kategori. Maaf jika saya tidak mengerti pertanyaannya. - person fernandomorgan; 19.02.2019
comment
Saya masih sangat penasaran mengapa jawaban ini diperlukan. Menurut Apple ini adalah bug yang diselesaikan pada 10.14.4. Lihat jawaban saya di atas. Saya tidak yakin apa yang ditambahkan jawaban ini ke utas ini. - person Charlie Fish; 19.02.2019
comment
baiklah 10.14.4 sepertinya bagus tapi belum keluar. Dan bahkan setelah dirilis, tidak semua orang akan langsung memperbaruinya (ini akan dirilis secara prod sekitar 25 Februari 2019). Jadi meskipun saya senang Apple memperbaiki bug ini, hal ini sebenarnya tidak akan membantu pengguna dengan versi 10.14.[0-3]. Dan bug ini benar-benar diperbaiki di 10.14.4. Tapi ya, untuk kedepannya tidak perlu menggunakan cara yang sudah ketinggalan zaman, cukup NSApp. NSApp.registerForRemoteNotifications(). - person fernandomorgan; 20.02.2019
comment
Bagaimana Anda tahu itu akan keluar dalam rilis produksi sekitar 25/2/19? Jawaban ini masih belum memberi nilai tambah apa pun menurut saya. Saya mengatakan bahwa mengubah baris menjadi NSApplication.shared.registerForRemoteNotifications(matching: [.alert, .sound, .badge]) berhasil. Bagaimana jawaban Anda menambah nilai lebih dari itu? - person Charlie Fish; 20.02.2019
comment
Maaf, ada kesalahpahaman di sini. Saya memiliki masalah yang sama tetapi saya harus mengirimkannya minggu ini, bukan Anda. Dan saya baru saja menjelaskan bahwa NSApp memang bagian dari framework Kakao, tidak perlu menggunakan NSApplication.shared. - hanya klarifikasi, maaf. - person fernandomorgan; 20.02.2019