এটি একটি সুপরিচিত পোষ্ট ... তবে এটি এখনও সমস্যার আসল সমাধান অনুপস্থিত (বিভিন্ন মন্তব্যে দেখানো হয়েছে)।
মূল প্রশ্নটি অ্যাপটি কখন চালু করা
/ একটি পুশ বিজ্ঞপ্তি থেকে খোলা হয়েছিল তা সনাক্তকরণ সম্পর্কিত , যেমন কোনও ব্যবহারকারী বিজ্ঞপ্তিতে ট্যাপ করে। উত্তরের কোনওটিই এই মামলাটি কভার করে না।
কোনও প্রজ্ঞাপন এলে কল প্রবাহে কারণ দেখা যায়, application:didReceiveRemoteNotification...
বিজ্ঞপ্তিটি যখন প্রাপ্ত হয় এবং যখন ব্যবহারকারীটি বিজ্ঞপ্তিটি টেপ করে তখন আবার কল হয় gets এই কারণে, আপনি কেবল UIApplicationState
এটির দ্বারা ব্যবহারকারীটি টেপ করে দেখে বলতে পারবেন না ।
অতিরিক্তভাবে, আপনাকে আর অ্যাপ্লিকেশনটির 'কোল্ড স্টার্ট' পরিস্থিতিটি পরিচালনা করতে হবে না application:didFinishLaunchingWithOptions...
যেমন application:didReceiveRemoteNotification...
আইওএস 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)
}
}
}
আমি আইওএস 9+ এ উভয় ক্ষেত্রে (পটভূমির অ্যাপ্লিকেশন, অ্যাপ চলমান নয়) এর জন্য এটি পরীক্ষা করেছি এবং এটি একটি কবজির মতো কাজ করে। ০.০ সেগুলিও বেশ রক্ষণশীল, আসল মান ~ 0.002s তাই 0.01 ঠিক আছে।