关闭应用程序后禁用 UILocalNotifications
Disabling UILocalNotifications after closing app
我在我的应用程序中使用信标(应用程序设置为后台),我正在 beacon:DidExitRegion:
上设置一系列 UILocalNotifications(信标丢失时的一种警报)。
编辑:当应用程序在后台时,用户退出区域,然后正确设置通知。当用户想要在应用程序仍处于后台并设置通知时关闭应用程序时,我想将它们全部禁用。 /编辑
问题是,我想在 AppWillTerminate
中禁用所有这些通知。根据 documetation 当应用程序处于挂起状态(在后台等待从信标 - CoreLocation 获取信号)时,不会调用 appWillTerminate
。用户经常会在应用程序处于后台时关闭应用程序,并且不会删除警报通知。
摆脱这些通知的可能方法是什么?
我有 1 个建议:
在后台执行 "artificial" 有限长度任务(如 here)
实际上 运行 收到 beacon:didExitRegion:
后的应用程序 -> 它不会被挂起, appWillTerminate
将被调用。
它会,但是最多只能工作 10 分钟,我认为这不是一件优雅的事情。
也许还有其他方法可以做到?
谢谢。
// 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
}
}
如果某个应用程序被 iOS 终止(例如,在您在任务切换器中向上滑动之后),那么下次您 enter/exit 一个信标区域时,AppDelegate
didFinishLaunchingWithOptions
方法将在 didEnterRegion
或 didExitRegion
之前调用。因此,您可以:
在didFinishLaunchingWithOptions
中初始化一个_launchTimetimestamp
。
在didExitRegion
中检查_launchTimestamp
过去是否少于一秒左右,如果是则抑制通知。
当用户在任务切换器中向上滑动您的应用时,您无法执行任何操作。没有回调,appWillTerminate
或其他。这是设计使然。
您可以修改延迟通知,以便在程序控制下的定时延迟后立即由您的应用发送。这样,只有在计时器关闭时应用程序仍处于 运行 时才会发送它们。诀窍是您的应用程序可能由于其他原因(用户锁定 phone,切换到另一个应用程序)而被暂停,因此您可能需要一个后台任务来执行此操作。顺便说一句,iOS 7+ 中的限制现在是 3 分钟而不是 10 分钟,因此这是您可以可靠地延迟通知的最长时间。
我在我的应用程序中使用信标(应用程序设置为后台),我正在 beacon:DidExitRegion:
上设置一系列 UILocalNotifications(信标丢失时的一种警报)。
编辑:当应用程序在后台时,用户退出区域,然后正确设置通知。当用户想要在应用程序仍处于后台并设置通知时关闭应用程序时,我想将它们全部禁用。 /编辑
问题是,我想在 AppWillTerminate
中禁用所有这些通知。根据 documetation 当应用程序处于挂起状态(在后台等待从信标 - CoreLocation 获取信号)时,不会调用 appWillTerminate
。用户经常会在应用程序处于后台时关闭应用程序,并且不会删除警报通知。
摆脱这些通知的可能方法是什么?
我有 1 个建议:
在后台执行 "artificial" 有限长度任务(如 here)
实际上 运行 收到 beacon:didExitRegion:
后的应用程序 -> 它不会被挂起, appWillTerminate
将被调用。
它会,但是最多只能工作 10 分钟,我认为这不是一件优雅的事情。
也许还有其他方法可以做到? 谢谢。
// 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
}
}
如果某个应用程序被 iOS 终止(例如,在您在任务切换器中向上滑动之后),那么下次您 enter/exit 一个信标区域时,AppDelegate
didFinishLaunchingWithOptions
方法将在 didEnterRegion
或 didExitRegion
之前调用。因此,您可以:
在
didFinishLaunchingWithOptions
中初始化一个_launchTimetimestamp
。在
didExitRegion
中检查_launchTimestamp
过去是否少于一秒左右,如果是则抑制通知。
当用户在任务切换器中向上滑动您的应用时,您无法执行任何操作。没有回调,appWillTerminate
或其他。这是设计使然。
您可以修改延迟通知,以便在程序控制下的定时延迟后立即由您的应用发送。这样,只有在计时器关闭时应用程序仍处于 运行 时才会发送它们。诀窍是您的应用程序可能由于其他原因(用户锁定 phone,切换到另一个应用程序)而被暂停,因此您可能需要一个后台任务来执行此操作。顺便说一句,iOS 7+ 中的限制现在是 3 分钟而不是 10 分钟,因此这是您可以可靠地延迟通知的最长时间。