检测应用程序是否因UILocalNotification而获得焦点

osk*_*kob 7 iphone cocoa-touch

我正在创建一个应用程序来跟踪一些用户定义的间隔重复的提醒.

当警报显示时,我已经这样做了,动作标题显示为"续订".单击此按钮时,应用程序将打开,此处我想创建下一个提醒,但问题是我不知道应用程序是否打开,因为点击了通知按钮或者在应用程序运行时触发了通知.

有人有任何想法吗?

osk*_*kob 13

我不知道我的问题是否不清楚,但似乎我得到了4个不同的答案,这些答案都误解了我的问题:P

但是,我发现didReceiveLocalNotivication发生在willEnterForeground和didBecomeActive之间,所以我这样做是为了确定应用程序是否已经打开:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    NSLog(@"Opened from notification? %@", wasInactive ? @"yes!" : @"no!");
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    wasInactive = YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    wasInactive = NO;

}
Run Code Online (Sandbox Code Playgroud)

  • 比这更简单,完全废弃`applicationWillEnterForeground:`和`applicationDidBecomeActive:`中的东西,然后在`application:didReceiveLocalNotification:`中检查`application.applicationState`.如果应用程序状态为"UIApplicationStateActive",则在应用程序运行时收到通知.如果是'UIApplicationStateInactive`或'UIApplicationStateBackground`,则在应用程序恢复时收到它.顺便说一下,我怀疑当前版本在后台任务中将应用程序带回前台时会失败,尽管我需要对其进行测试. (5认同)

Rob*_*ill 13

执行此操作的"正确"方法是在应用程序中检查NSApplication的applicationState属性:didReceiveRemoteNotification:您的委托方法.

从处理本地通知的文档:

iOS注意:在iOS中,您可以确定是否由于用户点击操作按钮而启动了应用程序,或者是否通过检查应用程序状态将通知传递给已在运行的应用程序.在委托的应用程序实现中:didReceiveRemoteNotification:或application:didReceiveLocalNotification:方法,获取applicationState属性的值并对其进行评估.如果值为UIApplicationStateInactive,则用户点击操作按钮; 如果值为UIApplicationStateActive,则应用程序在收到通知时位于最前端.

这类似于使用applicationWillEnterForeground和applicationDidBecomeActive中设置的标志但具有系统支持的解决方案.