我正在制作一个应用程序,用于跟踪用户定义的时间间隔重复的一些提醒。检测应用程序是否因UILocalNotification而引起焦点
我做到了,所以当警报显示时,动作标题显示“续订”。当你点击这个时,应用程序打开,在这里我想创建下一个提醒,但问题是,我不知道应用程序是否打开,因为通知按钮被点击,或者如果通知在应用程序运行时触发。
任何人有任何想法?
我正在制作一个应用程序,用于跟踪用户定义的时间间隔重复的一些提醒。检测应用程序是否因UILocalNotification而引起焦点
我做到了,所以当警报显示时,动作标题显示“续订”。当你点击这个时,应用程序打开,在这里我想创建下一个提醒,但问题是,我不知道应用程序是否打开,因为通知按钮被点击,或者如果通知在应用程序运行时触发。
任何人有任何想法?
“正确”的方式做,这是考察你的NSApplication的applicationState应用程序中的属性:didReceiveRemoteNotification:委托的方法。
从documentation处理本地通知:
的iOS注:在iOS中,您可以决定一个应用程序启动 当用户敲击动作按钮或 通知是否被交付的结果到 检查应用程序状态的已经运行的应用程序。在代理执行 的应用程序中:didReceiveRemoteNotification:或 application:didReceiveLocalNotification:方法,获取 applicationState属性的值并对其进行评估。如果值为 UIApplicationStateInactive,用户点击操作按钮;如果 值为UIApplicationStateActive,那么当 收到通知时,应用程序是最前面的。
这与使用applicationWillEnterForeground和applicationDidBecomeActive中设置的标志的解决方案类似,但具有系统支持。
您正在寻找
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
或
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
中查找documentation为UIApplication的启动选项键。应用程序的最后一个参数:didFinishLaunchingWithOptions:委托方法包含您需要的信息。
如果你的应用程序已经运行,你会得到的应用程序委托
application:didReceiveLocalNotification:
此委托消息如果没有运行,你将不得不使用
application:didFinishLaunchingWithOptions:
您需要以两种方法适当地应对以覆盖所有情况
更新
要检测用户是否激活操作按钮需要更多复杂性。我们可以知道application:didFinishLaunchingWithOptions:
将本地通知作为启动选项,但application:didReceiveLocalNotification:
会更难。
由于应用程序在用户点击按钮后变为活动状态,我们必须推迟,直到我们看到该消息(或不是)。在application:didReceiveLocalNotification
中设置NSTimer
,并在didBecomeActive
中取消。这意味着用户按下了操作按钮。如果计时器未取消,则用户在应用程序启动时进入。
我不知道如果我的问题是,目前还不清楚,但似乎我有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;
}
比这更简单,废钢'applicationWillEnterForeground东西:'和'applicationDidBecomeActive:'完全只是在'application:didReceiveLocalNotification:'中检查'application.applicationState'。如果应用程序状态为'UIApplicationStateActive',则在应用程序运行时收到通知。如果它是'UIApplicationStateInactive'或'UIApplicationStateBackground',则在应用程序恢复时收到它。顺便说一句,我怀疑你的当前版本在后台任务期间将应用程序带回前台时会失败,但我需要测试它。 –
同意马克!这在AppDelegate.m谢谢! –
在这种方法,您的应用程序代理:
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
你^ h AVE检查看这个关键的launchOptions:
UIApplicationLaunchOptionsLocalNotificationKey
当你已经主动将其称为:
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
嗯,不知道你的意思。这只会在我第一次打开应用程序时触发。如果应用仍然处于后台,那永远不会发生。 – oskob
啊,好点...我误解了这个问题。我将编辑 – filipe