关闭应用程序后禁用 UILocalNotifications
Posted
技术标签:
【中文标题】关闭应用程序后禁用 UILocalNotifications【英文标题】:Disabling UILocalNotifications after closing app 【发布时间】:2015-05-18 08:49:31 【问题描述】:我在我的应用程序中使用信标(应用程序设置为后台),我正在beacon:DidExitRegion:
上设置一系列 UILocalNotifications(信标丢失时的警报)。
编辑:当应用程序在后台时,用户退出区域,然后通知设置正确。当用户想要在应用程序仍在后台设置通知时关闭应用程序时,我想将它们全部禁用。 /编辑
问题是,我想禁用AppWillTerminate
中的所有通知。根据documetation,当应用程序处于挂起状态(在后台等待从信标-CoreLocation 获取信号)时,不会调用appWillTerminate
。用户通常会在应用处于后台时关闭应用,并且不会删除警报通知。
消除这些通知的可能方法是什么?
我有 1 条建议:
在后台执行“人工”有限长度任务(如 here)
并在收到beacon:didExitRegion:
后实际运行应用程序-> 它不会被挂起,appWillTerminate
将被调用。
但是,它最多只能工作 10 分钟,而且我认为这不是一件优雅的事情。
也许其他方法可以做到这一点? 谢谢。
【问题讨论】:
【参考方案1】:// Specify custom data for the notification
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
localNotif.userInfo = infoDict;
你可以给你的通知一个键来识别,也可以删除它
UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
NSDictionary *userInfoCurrent = oneEvent.userInfo;
NSString *key=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:@"someKey"]];
if ([uid isEqualToString:uidtodelete])
//Cancelling local notification
[app cancelLocalNotification:oneEvent];
break;
来自 Apple 文档:
对于不支持后台执行或链接到 ios 3.x 或更早版本的应用程序,当用户退出应用程序时始终调用此方法。对于支持后台执行的应用程序,当用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。但是,在应用程序在后台运行(未挂起)并且系统出于某种原因需要终止它的情况下,可能会调用此方法。
applicationWillTerminate when is it called and when not
如果您的应用启用了后台使用:
- (void)applicationDidEnterBackground:(UIApplication *)application
//位置管理委托
-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
if (state == CLRegionStateInside)
//Start Ranging
[manager startRangingBeaconsInRegion:self.beaconRegion];
else
//Stop Ranging here
【讨论】:
这是一种禁用特定通知的方法。我实际上是用它来删除特定信标的通知。问题是,我在关闭应用程序时无法使用它,因为没有调用 appWillTerminate。 您所写的方法将在应用程序处于前台时按下主页按钮时启动。我的应用程序处于后台(代码未实际运行,等待来自 CoreLocation 的触发器 -> 应用程序处于暂停状态)并且暂停的应用程序不会在关闭时调用 appWillTerminate(双击主页按钮并“向上滑动应用程序”),我想要删除通知。 是的,我知道了,但即使应用程序从后台删除,信标位置管理器委托功能仍然有效。您可以使用这些功能并删除所有通知。我已经编辑了该功能。检查如果这种方式适合你 我已经编辑了我的问题。我认为我们一开始就误解了情况。请。现在看看。【参考方案2】:当用户在任务切换器中向上滑动您的应用时,您无法执行任何操作。没有回调,appWillTerminate
或其他。这是设计使然。
您也许可以修改延迟通知,以便在程序控制下的定时延迟后立即由您的应用发送。这样,只有在计时器关闭时应用程序仍在运行时才会发送它们。诀窍是您的应用程序可能因其他原因而暂停(用户锁定手机,切换到另一个应用程序),因此您可能需要后台任务来执行此操作。顺便说一句,iOS 7+ 的限制现在是 3 分钟而不是 10 分钟,所以这是您可以可靠地延迟通知的最长时间。
【讨论】:
是的,这是我最害怕的答案。所以这就像我在问题结束时的建议一样。只是为了通过后台任务让它保持一定的时间。感谢您的建议。【参考方案3】:如果应用程序被 iOS 终止(例如,在您在任务切换器中向上滑动之后),那么下次您进入/退出信标区域时,AppDelegate
的 didFinishLaunchingWithOptions
方法将在 @987654323 之前调用@ 或 didExitRegion
。因此,您可以:
在didFinishLaunchingWithOptions
中初始化一个_launchTimetimestamp
。
在didExitRegion
中检查_launchTimestamp
是否在过去不到一秒左右,如果是则禁止通知。
【讨论】:
我已经编辑了我的问题。情况与您解决的情况略有不同。 didExitRegion 不会被第二次调用(第一次退出区域时会设置通知),并且在向上滑动应用时会禁用通知。 在这种情况下,在通知出现之前是否调用了 didFinishLaunchingWithOptions?如果是这样,您可以使用它来取消它们。以上是关于关闭应用程序后禁用 UILocalNotifications的主要内容,如果未能解决你的问题,请参考以下文章