检测是不是在应用未启动且用户未通过它们打开应用时收到推送通知

Posted

技术标签:

【中文标题】检测是不是在应用未启动且用户未通过它们打开应用时收到推送通知【英文标题】:Detect If push notifications were received when app is not launched and user didn't open the app through them检测是否在应用未启动且用户未通过它们打开应用时收到推送通知 【发布时间】:2016-09-21 14:12:47 【问题描述】:

是否有可能在应用离线时检测是否收到推送通知(不是在后台或前台?考虑到用户直接从弹簧板而不是从推送通知警报打开应用程序的情况。

【问题讨论】:

你可以通过点击通知来打开你的应用......它已经在构建中 How to know Push Notification delivery status的可能重复 【参考方案1】:

来自 - application:didReceiveRemoteNotification:fetchCompletionHandler:的文档

当您的应用在前台或后台运行时,系统会调用此方法。

但是,正如您可能已经从您的问题中发现的那样

但是,如果用户强制退出应用,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用或重启设备,然后系统才会再次尝试自动启动您的应用。

【讨论】:

【参考方案2】:

在您的AppDelegate 中执行此操作(抱歉快速实施):

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    // We see if we have a recent push notification date stored in the user defaults.
    // If there hasn't been a recent one sent this if block will not be entered.
    if let mostRecentPushNotificationDate = NSUserDefaults.standardUserDefaults().objectForKey("mostRecentPushNotification") as? NSDate 

        // We find the difference between when the notification was sent and when the app was opened
        let interval = NSDate().timeIntervalSinceDate(mostRecentPushNotificationDate)

        // Check to see if we opened from the push notification
        if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] 
            print("we opened from the push notifcation and the time difference was \(interval) seconds.")
        

        // We did not open from a push notification
        else 
            print("we opened from the spring board and the time difference was \(interval) seconds.")
        

        // We remove the object from the store so if they open the app without a notification being sent we don't check this if block
        NSUserDefaults.standardUserDefaults().removeObjectForKey("mostRecentPushNotification")
    


    return true


func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 

    // Set a flag when a push notification was sent
    NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "mostRecentPushNotification")

【讨论】:

这是如何检测您是否收到推送通知但没有从它启动的? 我有兴趣检测何时收到通知,然后用户直接从跳板而不是通知警报本身启动应用程序 我试过了,不幸的是不起作用,因为除非应用程序在后台运行,否则不会调用该方法 @M_Waly 你没有正确设置推送通知。您必须在其中设置 `content-available` 标志。看到这个帖子***.com/questions/19390868/… 更改 content -available 会更改通知的传递方式,因此并不总是合适的。 IMO这个答案没有回答原始问题:1 - 应用程序根本没有启动(不在后台); 2 - 收到通知(可能是最高优先级的通知,因此不能将content -available 设置为建议的1); 3 - 用户从图标而不是通知启动应用程序 --> 如何检测未完成的通知?【参考方案3】:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    // ...
    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) 
        [self application:application didReceiveRemoteNotification:launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]];
    

这应该可行。

在您打开应用程序的那一刻,您在通知中心收到的通知将作为有效载荷在didFinishLaunchingWithOptions 中获取,然后您可以执行特定操作。

【讨论】:

只有当应用在后台或前台或者从通知警报启动时,如果它既不在后台也不在前台但收到推送通知,然后从弹簧板正常启动呢?

以上是关于检测是不是在应用未启动且用户未通过它们打开应用时收到推送通知的主要内容,如果未能解决你的问题,请参考以下文章

未安装应用时,Firebase 动态链接会打开 Weblink 而不是 App Store

当我在 GPS 关闭的情况下启动应用程序,后来 GPS 被激活时,未检测到位置

WinForm检测用户是不是已登陆的方法--简单问题--请高手回答!

在 iOS 8 Beacon 中未检测到

如何制作过滤器以检测用户是不是请求了未找到的页面?

应用程序未通过文本服务框架 DLL 检测输入语言更改