นี่คือโพสต์ที่สวมใส่ได้ดี ... แต่ก็ยังขาดวิธีการแก้ปัญหาที่แท้จริง(ตามที่ได้กล่าวไว้ในความคิดเห็นต่างๆ)
คำถามเดิมเกี่ยวกับการตรวจสอบเมื่อเปิดตัวแอพ
/ เปิดจากการแจ้งเตือนแบบพุชเช่นผู้ใช้แตะที่การแจ้งเตือน ไม่มีคำตอบใดที่ครอบคลุมกรณีนี้
เหตุผลสามารถเห็นได้ในโฟลว์การโทรเมื่อการแจ้งเตือนมาถึง application:didReceiveRemoteNotification...
ถูกเรียกเมื่อได้รับการแจ้งเตือนและอีกครั้งเมื่อผู้ใช้แตะที่การแจ้งเตือน ด้วยเหตุนี้คุณไม่สามารถบอกได้โดยดูUIApplicationState
จากผู้ใช้ที่แตะมัน
นอกจากนี้คุณไม่จำเป็นต้องจัดการกับสถานการณ์ 'แอปเริ่มต้นใหม่' ของแอปอีกต่อไปapplication:didFinishLaunchingWithOptions...
ซึ่งapplication:didReceiveRemoteNotification...
จะถูกเรียกอีกครั้งหลังจากเปิดตัวใน iOS 9+ (อาจเป็น 8 เช่นกัน)
ดังนั้นคุณจะบอกได้อย่างไรว่าผู้ใช้การแตะเริ่มต้นห่วงโซ่เหตุการณ์หรือไม่ วิธีแก้ปัญหาของฉันคือการทำเครื่องหมายเวลาที่แอปเริ่มออกมาจากพื้นหลังหรือเริ่มเย็นจากนั้นตรวจสอบเวลาapplication:didReceiveRemoteNotification...
นั้น หากน้อยกว่า 0.1 วินาทีคุณสามารถมั่นใจได้ว่าการแตะเริ่มการทำงาน
สวิฟท์ 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)
}
}
}
สวิฟท์ 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)
}
}
}
ฉันได้ทดสอบสิ่งนี้สำหรับทั้งสองกรณี (แอปในพื้นหลังแอปที่ไม่ได้ทำงาน) บน iOS 9+ และใช้งานได้อย่างมีเสน่ห์ 0.1 ก็ค่อนข้างอนุรักษ์นิยมเช่นกันค่าที่แท้จริงคือ ~ 0.002 ดังนั้น 0.01 ก็ดีเช่นกัน