关闭应用程序后禁用 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 终止(例如,在您在任务切换器中向上滑动之后),那么下次您进入/退出信标区域时,AppDelegatedidFinishLaunchingWithOptions 方法将在 @987654323 之前调用@ 或 didExitRegion。因此,您可以:

    didFinishLaunchingWithOptions中初始化一个_launchTimetimestamp

    didExitRegion 中检查_launchTimestamp 是否在过去不到一秒左右,如果是则禁止通知。

【讨论】:

我已经编辑了我的问题。情况与您解决的情况略有不同。 didExitRegion 不会被第二次调用(第一次退出区域时会设置通知),并且在向上滑动应用时会禁用通知。 在这种情况下,在通知出现之前是否调用了 didFinishLaunchingWithOptions?如果是这样,您可以使用它来取消它们。

以上是关于关闭应用程序后禁用 UILocalNotifications的主要内容,如果未能解决你的问题,请参考以下文章

Linux服务管理(如何关闭或禁用不需要的服务

注册表怎么禁用powershell

如果蓝牙关闭 iOS,则禁用警告对话框

单击href后禁用关闭下拉列表

如何在 Visual Studio 中禁用基于对话框的 MFC 应用程序的自动关闭?

如何在flutter中登录后禁用用户返回