检测应用是否从推送通知启动/打开
是否有可能知道应用程序是否从推送通知启动/打开?
我想这个发布会可以在这里抓到:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if (launchOptions != nil) {
         // Launched from push notification
         NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    }
}
但是,当应用程序在后台时,如何才能检测到它是从推送通知中打开的?
请参阅此代码:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground  )
    {
         //opened from a push notification when the app was on background
    }
}
与...一样
-(void)application:(UIApplication *)application didReceiveLocalNotification (UILocalNotification *)notification
晚但可能有用
当应用程序未运行时
叫做 ..
你需要检查推送通知
NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (notification) {
    NSLog(@"app recieved notification from remote%@",notification);
    [self application:application didReceiveRemoteNotification:notification];
} else {
    NSLog(@"app did not recieve notification");
}
这是一个很老的帖子......但它仍然缺少解决问题的实际办法 (正如各种评论所指出的那样)。
原始问题是关于通过推送通知来检测应用何时启动 / 打开 ,例如用户点击通知。 没有一个答案实际上涵盖了这种情况。
  原因可以在通知到达时在呼叫流程中看到, application:didReceiveRemoteNotification... 
  当接到通知时再通知是由用户点击被调用。  正因为如此,用户只需查看UIApplicationState就可以知道用户点击了它。 
  此外,您不再需要处理应用程序在application:didFinishLaunchingWithOptions...中的“冷启动”情况application:didFinishLaunchingWithOptions...作为application:didReceiveRemoteNotification...在iOS 9+(也可能是8)中启动后再次调用。 
  那么,你怎么知道用户点击是否开始了事件链?  我的解决方案是标记应用程序开始走出背景或冷启动的时间,然后在application:didReceiveRemoteNotification...检查时间application:didReceiveRemoteNotification...  如果它小于0.1s,那么你可以很确定龙头触发了启动。 
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)
    }
  }
}
斯威夫特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也很好。
链接地址: http://www.djcxy.com/p/62609.html上一篇: Detect if the app was launched/opened from a push notification
