यह एक अच्छी तरह से पहना हुआ पद है ... लेकिन यह अभी भी समस्या का एक वास्तविक समाधान याद कर रहा है (जैसा कि विभिन्न टिप्पणियों में बताया गया है)।
मूल प्रश्न यह पता लगाने के बारे में है कि ऐप को एक पुश अधिसूचना से कब लॉन्च
/ खोला गया था , उदाहरण के लिए उपयोगकर्ता अधिसूचना पर टैप करता है। कोई भी उत्तर वास्तव में इस मामले को कवर नहीं करता है।
नोटिफिकेशन आने पर इसका कारण कॉल फ्लो देखा जा सकता है, 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.1s बहुत रूढ़िवादी है, वास्तविक मान ~ 0.002s है, इसलिए 0.01 ठीक है।