Ini adalah posting yang sudah usang ... tetapi masih belum ada solusi aktual untuk masalah ini (seperti yang ditunjukkan dalam berbagai komentar).
Pertanyaan aslinya adalah tentang mendeteksi kapan aplikasi diluncurkan
/ dibuka dari pemberitahuan push, misalnya pengguna mengetuk pemberitahuan tersebut. Tidak ada jawaban yang benar-benar membahas kasus ini.
Alasannya dapat dilihat dalam aliran panggilan ketika pemberitahuan tiba, application:didReceiveRemoteNotification...
dipanggil saat pemberitahuan diterima DAN lagi ketika pemberitahuan diketuk oleh pengguna. Karena itu, Anda tidak dapat mengetahui hanya dengan melihat UIApplicationState
apakah pengguna mengetuknya.
Selain itu, Anda tidak perlu lagi menangani situasi 'permulaan yang dingin' dari aplikasi application:didFinishLaunchingWithOptions...
seperti application:didReceiveRemoteNotification...
yang dipanggil lagi setelah diluncurkan di iOS 9+ (mungkin 8 juga).
Jadi, bagaimana Anda bisa tahu jika pengguna mengetuk rantai kejadian? Solusi saya adalah dengan menandai waktu di mana aplikasi mulai keluar dari latar belakang atau mulai dingin dan kemudian memeriksa waktu masuk application:didReceiveRemoteNotification...
. Jika kurang dari 0,1, maka Anda dapat yakin keran memicu startup.
Swift 2.x
class AppDelegate: UIResponder, UIApplicationDelegate {
var wakeTime : NSDate = NSDate() // when did our application wake up most recently?
func applicationWillEnterForeground(application: UIApplication) {
// time stamp the entering of foreground so we can tell how we got here
wakeTime = NSDate()
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
// ensure the userInfo dictionary has the data you expect
if let type = userInfo["type"] as? String where type == "status" {
// IF the wakeTime is less than 1/10 of a second, then we got here by tapping a notification
if application.applicationState != UIApplicationState.Background && NSDate().timeIntervalSinceDate(wakeTime) < 0.1 {
// User Tap on notification Started the App
}
else {
// DO stuff here if you ONLY want it to happen when the push arrives
}
completionHandler(.NewData)
}
else {
completionHandler(.NoData)
}
}
}
Cepat 3
class AppDelegate: UIResponder, UIApplicationDelegate {
var wakeTime : Date = Date() // when did our application wake up most recently?
func applicationWillEnterForeground(_ application: UIApplication) {
// time stamp the entering of foreground so we can tell how we got here
wakeTime = Date()
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// ensure the userInfo dictionary has the data you expect
if let type = userInfo["type"] as? String, type == "status" {
// IF the wakeTime is less than 1/10 of a second, then we got here by tapping a notification
if application.applicationState != UIApplicationState.background && Date().timeIntervalSince(wakeTime) < 0.1 {
// User Tap on notification Started the App
}
else {
// DO stuff here if you ONLY want it to happen when the push arrives
}
completionHandler(.newData)
}
else {
completionHandler(.noData)
}
}
}
Saya telah menguji ini untuk kedua kasus (aplikasi di latar belakang, aplikasi tidak berjalan) di iOS 9+ dan itu berfungsi seperti pesona. 0,1s juga cukup konservatif, nilai sebenarnya adalah ~ 0,002s jadi 0,01 juga baik-baik saja.