检测应用程序是不是通过单击应用程序图标或推送通知启动(当应用程序被用户强制终止时)
Posted
技术标签:
【中文标题】检测应用程序是不是通过单击应用程序图标或推送通知启动(当应用程序被用户强制终止时)【英文标题】:Detect if Application is launched by clicking app icon or by push notification (when app is force killed by user)检测应用程序是否通过单击应用程序图标或推送通知启动(当应用程序被用户强制终止时) 【发布时间】:2020-08-20 14:57:41 【问题描述】:在 ios 13 中测试,我仍然难以检测应用是从应用图标启动还是从推送通知启动。
我知道我们可以通过以下方式检查启动选项中是否存在通知键:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
if (launchOptions != nil)
// Launched from push notification
NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
问题是我发现“UIApplicationLaunchOptionsRemoteNotificationKey”甚至在我通过单击通知面板中存在未决通知的应用程序图标启动应用程序时出现(应用程序被强制终止)。只有当我清除面板中的通知,然后通过应用图标启动应用时,“UIApplicationLaunchOptionsRemoteNotificationKey”才不存在。
在这种情况下,无论是从应用程序图标还是通知启动,UIApplicationLaunchOptionsRemoteNotificationKey 仍然是三个,所以我无法区分是应该将应用程序重定向到推送内容还是正常启动。
我听说有些人说如果从通知启动,“didReceiveRemoteNotification”将在“didFinishLaunchingWithOptions”之后调用,但是,在我的情况下,在这两种情况下都不会只调用“didFinishLaunchingWithOptions”。
当应用程序被杀死时,任何人在 iOS 13 中遇到同样的问题?任何帮助将不胜感激,谢谢。
【问题讨论】:
更多信息:1)杀死应用程序->接收推送->通过应用程序图标打开应用程序-> UIApplicationLaunchOptionsRemoteNotificationKey 在那里 2)接收推送->杀死应用程序->通过应用程序图标打开应用程序-> UIApplicationLaunchOptionsRemoteNotificationKey 是没有 【参考方案1】:只需在下面添加检查
if (notification != nil)
// do your action
还要检查数据,添加警报视图,您将在其中打印通知数据。
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Test"
message:notification
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
如果notification 为nil,表示app 没有被push 打开。当您安装新应用程序时,单击应用商店上的打开按钮可能会打开它。
【讨论】:
感谢您的帮助。但我的问题是即使我通过单击应用程序图标启动应用程序,通知字典也存在(应用程序被强制关闭,通知面板中有通知)。任何的想法?这是故意的吗? @MichaelChiu :在这种情况下,肯定通知将为零。直接点击应用图标不会有数据。 这个答案不正确。就像@MichaelChiu 描述的那样,我可以确认我观察到launchOptions 字典在某些情况下包含键 UIApplicationLaunchOptionsRemoteNotificationKey 和推送信息值。我无法识别规则,也没有在官方文档中找到提示。但是,我注意到何时您单击应用程序图标似乎也很重要。如果您同时打开一个或两个随机(不同)应用程序,则启动选项中包含远程字典的可能性较小。此外,如果您等待 一些 时间,则启动选项 dict 为 nil 的机会会增加。以上是关于检测应用程序是不是通过单击应用程序图标或推送通知启动(当应用程序被用户强制终止时)的主要内容,如果未能解决你的问题,请参考以下文章
通过单击图标、在控制台中键入其名称或从批处理文件中区分程序是不是运行