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

时间:2011-10-03 15:32:59

标签: iphone cocoa-touch

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

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

有人有任何想法吗?

6 个答案:

答案 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;

}

答案 1 :(得分:13)

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

documentation处理本地通知:

  

iOS注意:在iOS中,您可以确定是否已启动应用程序   由于用户点击动作按钮或是否   通知已通过发送到已经运行的应用程序   检查应用程序状态。在委托的实施中   应用程序:didReceiveRemoteNotification:或   application:didReceiveLocalNotification:方法,获取值   applicationState属性并对其进行评估。如果值是   UIApplicationStateInactive,用户点击了动作按钮;如果   值是UIApplicationStateActive,应用程序是最重要的   它收到了通知。

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

答案 2 :(得分:0)

您正在寻找

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

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

Documentation

答案 3 :(得分:0)

查找documentation以获取UIApplication启动选项密钥。应用程序的最后一个参数:didFinishLaunchingWithOptions:delegate方法包含您需要的信息。

另外,请查看application:didReceiveLocalNotification

答案 4 :(得分:0)

如果您的应用程序已在运行,您将在app delegate上获得此委托消息

application:didReceiveLocalNotification:

如果它没有运行,你将不得不使用

application:didFinishLaunchingWithOptions:

您需要在两种方法中做出适当的回应以涵盖所有情况

<强>已更新

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

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

答案 5 :(得分:0)

在此方法的app委托中:

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

您必须检查查看此密钥的launchOptions:

UIApplicationLaunchOptionsLocalNotificationKey

当你已经活跃时,这将被称为:

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