关闭应用

时间:2015-05-18 08:49:32

标签: ios background core-location ibeacon

我在我的应用程序中使用信标(app设置为后台),我在beacon:DidExitRegion:上设置了一系列UILocalNotifications(当信标丢失时会发出警报)。

编辑:当应用在后台时,用户退出区域,然后正确设置通知。当用户想要在应用程序设置时仍处于后台时关闭应用程序时,我想要全部禁用它们。 /编辑

问题是,我要在AppWillTerminate中禁用所有这些通知。根据{{​​3}}当app处于挂起状态(在后台等待从信标获取信号 - CoreLocation)时,不会调用appWillTerminate。用户通常会在应用程序处于后台时关闭该应用程序,并且不会删除警报通知。

有什么方法可以摆脱这些通知?

我有一个建议: 在后台执行“人工”有限长度任务(如documetation) 并在收到beacon:didExitRegion: - >后实际运行应用程序它不会被暂停,appWillTerminate将被调用。 然而,它只能工作10分钟,我认为这不是一件好事。

也许其他方法可以做到这一点? 感谢。

3 个答案:

答案 0 :(得分: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
}
}

答案 1 :(得分:0)

如果某个应用程序被iOS终止(例如,您在任务切换器中向上滑动),则下次进入/退出信标区域时,[Setup] CreateAppDir=No 的{​​{1}}方法将为在AppDelegatedidFinishLaunchingWithOptions之前调用。因此,您可以:

  1. didEnterRegion初始化didExitRegion

  2. _launchTimetimestamp中检查过去didFinishLaunchingWithOptions是否小于一秒左右,如果是,则禁止通知。

答案 2 :(得分:0)

当用户在任务切换器中刷新您的应用时,您无法执行任何操作。没有回调,appWillTerminate或其他。这是设计的。

您可以修改延迟通知,以便在程序控制下经过一段时间的延迟后,您的应用会立即发送这些通知。这样,只有在计时器熄灭时应用程序仍在运行时才会发送它们。诀窍是您的应用程序可能由于其他原因而被暂停(用户锁定手机,切换到另一个应用程序),因此您可能需要执行后台任务。顺便说一句,iOS 7+的限制现在是3分钟而不是10分钟,因此这是您可以可靠地延迟通知的最长时间。

相关问题