2011-10-03 47 views
7

我正在制作一个应用程序,用于跟踪用户定义的时间间隔重复的一些提醒。检测应用程序是否因UILocalNotification而引起焦点

我做到了,所以当警报显示时,动作标题显示“续订”。当你点击这个时,应用程序打开,在这里我想创建下一个提醒,但问题是,我不知道应用程序是否打开,因为通知按钮被点击,或者如果通知在应用程序运行时触发。

任何人有任何想法?

回答

13

“正确”的方式做,这是考察你的NSApplication的applicationState应用程序中的属性:didReceiveRemoteNotification:委托的方法。

documentation处理本地通知:

的iOS注:在iOS中,您可以决定一个应用程序启动 当用户敲击动作按钮或 通知是否被交付的结果到 检查应用程序状态的已经运行的应用程序。在代理执行 的应用程序中:didReceiveRemoteNotification:或 application:didReceiveLocalNotification:方法,获取 applicationState属性的值并对其进行评估。如果值为 UIApplicationStateInactive,用户点击操作按钮;如果 值为UIApplicationStateActive,那么当 收到通知时,应用程序是最前面的。

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

0

您正在寻找

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

Documentation

+0

嗯,不知道你的意思。这只会在我第一次打开应用程序时触发。如果应用仍然处于后台,那永远不会发生。 – oskob

+0

啊,好点...我误解了这个问题。我将编辑 – filipe

0

中查找documentation为UIApplication的启动选项键。应用程序的最后一个参数:didFinishLaunchingWithOptions:委托方法包含您需要的信息。

另外,看看application:didReceiveLocalNotification

+0

如果应用程序位于后台,则不会触发,可能会发生这种情况。 – oskob

+0

此外,didReceiveLocalNotification不会告诉应用程序是否已经打开,或者是否已通过通知打开 – oskob

0

如果你的应用程序已经运行,你会得到的应用程序委托

application:didReceiveLocalNotification: 

此委托消息如果没有运行,你将不得不使用

application:didFinishLaunchingWithOptions: 

您需要以两种方法适当地应对以覆盖所有情况

更新

要检测用户是否激活操作按钮需要更多复杂性。我们可以知道application:didFinishLaunchingWithOptions:将本地通知作为启动选项,但application:didReceiveLocalNotification:会更难。

由于应用程序在用户点击按钮后变为活动状态,我们必须推迟,直到我们看到该消息(或不是)。在application:didReceiveLocalNotification中设置NSTimer,并在didBecomeActive中取消。这意味着用户按下了操作按钮。如果计时器未取消,则用户在应用程序启动时进入。

+0

确切地说,我无法确定应用程序是否因通知的操作按钮被按下而被打开,或者如果事件被触发应用程序正在运行 – oskob

+0

这也将工作,但我觉得我的解决办法是清洁:)谢谢虽然 – oskob

+0

同意,使用计时器这样似乎哈克:) –

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; 

} 
+5

比这更简单,废钢'applicationWillEnterForeground东西:'和'applicationDidBecomeActive:'完全只是在'application:didReceiveLocalNotification:'中检查'application.applicationState'。如果应用程序状态为'UIApplicationStateActive',则在应用程序运行时收到通知。如果它是'UIApplicationStateInactive'或'UIApplicationStateBackground',则在应用程序恢复时收到它。顺便说一句,我怀疑你的当前版本在后台任务期间将应用程序带回前台时会失败,但我需要测试它。 –

+0

同意马克!这在AppDelegate.m谢谢! –

0

在这种方法,您的应用程序代理:

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

你^ h AVE检查看这个关键的launchOptions:

UIApplicationLaunchOptionsLocalNotificationKey

当你已经主动将其称为:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification