Ada banyak utas stackoverflow mengenai topik ini, tetapi saya masih belum menemukan solusi yang baik.
Jika aplikasi tidak di latar belakang, saya dapat memeriksa launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]
di application:didFinishLaunchingWithOptions:
panggilan untuk melihat apakah itu dibuka dari pemberitahuan.
Jika aplikasi berada di latar belakang, semua posting menyarankan untuk menggunakan application:didReceiveRemoteNotification:
dan memeriksa status aplikasi. Namun saat saya bereksperimen (dan juga seperti yang disarankan oleh API ini), metode ini dipanggil saat notifikasi diterima, bukan disadap.
Jadi masalahnya adalah, jika aplikasi diluncurkan dan kemudian di-background, dan Anda tahu pemberitahuan diterima dari application:didReceiveNotification
( application:didFinishLaunchWithOptions:
tidak akan memicu saat ini), bagaimana Anda tahu jika pengguna melanjutkan aplikasi dari dengan mengetuk pemberitahuan atau hanya mengetuk ikon aplikasi? Karena jika pengguna menge-tap notifikasi tersebut, harapannya adalah membuka halaman yang disebutkan dalam notifikasi tersebut. Kalau tidak, seharusnya tidak.
Saya dapat menggunakan handleActionWithIdentifier
untuk pemberitahuan tindakan kustom, tetapi ini hanya akan dipicu ketika tombol tindakan kustom diketuk, bukan saat pengguna mengetuk bagian utama pemberitahuan.
Terima kasih.
EDIT:
setelah membaca satu jawaban di bawah ini, saya berpikir dengan cara ini saya dapat menjelaskan pertanyaan saya:
Bagaimana kita bisa membedakan 2 skenario ini:
(A) 1.app pergi ke latar belakang; 2. pemberitahuan diterima; 3. pengguna mengetuk notifikasi; 4. aplikasi memasuki latar depan
(B) 1.app pergi ke latar belakang; 2. pemberitahuan diterima; 3. pengguna mengabaikan notifikasi dan mengetuk ikon aplikasi nanti; 4. aplikasi memasuki latar depan
Karena application:didReceiveRemoteNotification:
dipicu dalam kedua kasus di langkah 2.
Atau, harus application:didReceiveRemoteNotification:
dipicu di langkah 3 hanya untuk (A), tetapi entah bagaimana saya salah mengonfigurasi aplikasi sehingga saya melihatnya di langkah 2?
Jawaban:
OK akhirnya saya tahu.
Di setelan target ➝ tab Capabilities ➝ Mode Latar Belakang, jika Anda mencentang "Notifikasi Jarak Jauh",
application:didReceiveRemoteNotification:
akan dipicu segera setelah pemberitahuan tiba (selama aplikasi berada di latar belakang), dan dalam hal ini tidak ada cara untuk mengetahui apakah pengguna akan mengetuk notifikasi.Jika Anda tidak mencentang kotak itu, hanya
application:didReceiveRemoteNotification:
akan dipicu saat Anda mengetuk pemberitahuan.Agak aneh bahwa mencentang kotak ini akan mengubah perilaku salah satu metode delegasi aplikasi. Akan lebih baik jika kotak itu dicentang, Apple menggunakan dua metode delegasi yang berbeda untuk penerimaan pemberitahuan dan ketuk pemberitahuan. Saya pikir sebagian besar pengembang selalu ingin tahu apakah ada pemberitahuan yang disadap atau tidak.
Semoga ini bermanfaat bagi siapa pun yang mengalami masalah ini. Apple juga tidak mendokumentasikannya dengan jelas di sini, jadi saya butuh beberapa saat untuk mengetahuinya.
sumber
Saya telah mencari hal yang sama seperti Anda dan benar-benar menemukan solusi yang tidak memerlukan notifikasi jarak jauh untuk dicentang.
Untuk memeriksa apakah pengguna telah mengetuk, atau aplikasi di latar belakang atau aktif, Anda hanya perlu memeriksa status aplikasi di
Untuk info lebih lanjut, periksa:
Referensi Kerangka Kerja UIKit> Referensi Kelas Aplikasi UIA> UIApplicationState
sumber
content-available
kunci, tetapi kemudian notifikasi tersebut harus senyap (yaitu tidak menyertakan suara atau lencana) seperti yang dinyatakan dalam dokumen resmi .func applicationDidEnterBackground(_ application: UIApplication)
dan salah difunc applicationDidBecomeActive(_ application: UIApplication)
ini memungkinkan saya untuk menampilkan dalam aplikasi pemberitahuan ketika aplikasi tidak aktif karena pusat kendali atau daftar pemberitahuanMenurut iOS / XCode: bagaimana cara mengetahui bahwa aplikasi telah diluncurkan dengan klik pada notifikasi atau ikon aplikasi springboard? Anda harus memeriksa status aplikasi di didReceiveLocalNotification seperti ini:
Meskipun tidak masuk akal bagi saya, ini tampaknya berhasil.
sumber
Jika seseorang menginginkannya di 3.0 cepat
untuk cepat 4
sumber
Jika Anda memiliki "Mode Latar Belakang"> "Pemberitahuan jarak jauh" dicentang == YA, ketuk acara pemberitahuan akan tiba dalam:
Itu membantu saya. Nikmatilah :)
sumber
Saya mengalami masalah ini juga - tetapi di iOS 11 dengan
UserNotifications
Framework baru .Di sini bagi saya seperti ini:
application:didFinishLaunchingWithOptions:
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
userNotificationCenter(_:willPresent:withCompletionHandler:)
userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:
sumber
Dalam kasus saya, mode background OFF tidak ada bedanya. Namun, saat aplikasi ditangguhkan dan pengguna mengetuk notifikasi, saya dapat menangani kasus tersebut dalam metode callback ini:
sumber
Untuk iOS 10 dan di atasnya, letakkan ini di AppDelegate, untuk mengetahui pemberitahuan disadap (berfungsi bahkan aplikasi ditutup atau terbuka)
sumber
Ada dua Fungsi untuk pegangan yang diterima PushNotification di dalam
PushNotificationManager
kelas:Saat saya menguji pemicu pertama segera setelah Pemberitahuan tiba
Dan yang kedua saat Mengetuk Notifikasi:
Saya juga mengujinya dengan status ON dan OFF dari Remote Notification (dalam Mode Latar Belakang)
sumber
SWIFT 5.1
UIApplication.State
tidak berfungsi untuk saya, karena setelah saya membaca sidik jari (modal ditampilkan) di aplikasi saya, notifikasi juga ditampilkan di bilah atas dan pengguna harus mengkliknya.Saya telah membuat
public static var isNotificationFromApp: Bool = false
masuk
AppDelegate
dan saya mengaturnyatrue
di awal sayaviewController
dan kemudian di pemberitahuan sayastoryboard
/viewController
saya hanya memeriksa itu :)Semoga bisa berguna
sumber
Anda bisa mengonfigurasi payload push notification untuk memanggil
application:didReceiveRemoteNotification:fetchCompletionHandler:
metode delegasi aplikasi saat aplikasi berjalan di latar belakang. Anda dapat menyetel beberapa tanda di sini sehingga saat pengguna meluncurkan aplikasi Anda di lain waktu, Anda dapat melakukan operasi Anda.Dari dokumentasi apple, Anda harus menggunakan metode ini untuk mendownload konten baru yang terkait dengan notifikasi push. Juga agar ini berfungsi, Anda harus mengaktifkan Notifikasi jarak jauh dari mode Latar Belakang dan payload notifikasi push Anda harus berisi
content-available
kunci dengan nilainya disetel ke 1. Dari info lebih lanjut silakan lihat bagian Menggunakan Notifikasi Push untuk Memulai Download dari apple doc di sini .Cara lain adalah memiliki jumlah lencana dalam payload pemberitahuan push. Jadi, saat aplikasi Anda diluncurkan, Anda dapat memeriksa jumlah lencana aplikasi. Jika parutannya lebih dari nol, lakukan operasi Anda dan nol / hapus lencana dari server juga.
Semoga ini bisa membantu Anda.
sumber