ios 7 中的区域监控

Posted

技术标签:

【中文标题】ios 7 中的区域监控【英文标题】:Region monitoring in ios 7 【发布时间】:2013-11-20 08:14:41 【问题描述】:

对于 6 和 7 版本,我应该在我的 ios 应用程序中使用区域监控。如果我的应用程序被关闭,那么系统应该打开它。它适用于 iOS 6,但不适用于 iOS 7。我的意思是,如果应用在 ios 7 中关闭,系统不会打开我的应用。

关于关闭应用,我的意思是,从内存中杀死这个应用。

我使用这个代码:

manager = [CLLocationManager new];

manager.delegate = self;

[manager startUpdatingLocation];

if ([UIDevice isIOS7OrHigher]) 

    CLCircularRegion *reg = [[CLCircularRegion alloc] initCircularRegionWithCenter:CLLocationCoordinate2DMake(56.844947, 53.208852) radius:20.f identifier:@"reg14132"];

    [manager startMonitoringForRegion:reg];

    CLCircularRegion *reg1 = [[CLCircularRegion alloc] initCircularRegionWithCenter:CLLocationCoordinate2DMake( 56.844158,53.20913) radius:20.f identifier:@"reg14131232"];

    [manager startMonitoringForRegion:reg1];

 else 

    CLRegion *reg = [[CLRegion alloc]  initCircularRegionWithCenter:CLLocationCoordinate2DMake(56.844947, 53.208852) radius:20.f identifier:@"reg14132"];

    [manager startMonitoringForRegion:reg];

    CLRegion *reg1 = [[CLRegion alloc] initCircularRegionWithCenter:CLLocationCoordinate2DMake( 56.844158,53.20913) radius:20.f identifier:@"reg14131232"];
    [manager startMonitoringForRegion:reg1];

我使用委托方法来记录日志。另外,我使用此代码进行测试

if (launchOptions) 
    UILocalNotification *note = [UILocalNotification new];
    note.alertBody = [NSString stringWithFormat:@"launchOptions = %@", launchOptions];
    [[UIApplication sharedApplication] presentLocalNotificationNow:note];

【问题讨论】:

您需要提供有关您的问题的更多详细信息、您的区域监控和后台代码示例。 @alex_izh 请在代码中使用code 样式而不是quote 样式,谢谢。 【参考方案1】:

这是现在从 iOS7 开始的预期行为。在 iOS6 及更早版本中,即使您从应用切换器手动终止应用,当用户进入/退出区域时,您仍然会收到通知。这种行为在 iOS7 中改变了。如果用户从应用程序切换器中终止了应用程序,即通过向上滑动您的应用程序,那么他们将不再收到任何基于位置的通知,包括区域监控通知。一位 Apple 员工在 Apple 官方开发者论坛 -link here 上证实了这一点。

Apple Dev 提供的唯一解决方案是“如果此更改对您有问题或您希望看到不同的东西,请提交错误报告。”

我个人认为这是一个糟糕的决定,因为它违背了后台通知的目的。您将不得不建议您的用户从 iOS6 升级,因为他们将继续期待类似的功能,并且此更改尚未在任何地方记录。

编辑:正如@herz 所指出的,从 iOS 7.1 开始,后台监控功能已恢复到 iOS 6 中的状态。区域将受到监控,您的应用甚至会收到通知当它被应用切换器杀死时。

【讨论】:

我不同意这是一个糟糕的决定。如果用户强制退出您的应用程序,那可能是因为他不想再与它有任何关系(但不想删除它)。 我认为这一切在 iOS 7.1 中再次发生了变化,因为现在当应用程序不在托盘中时我会收到通知... @HerzRod,你确定ios7.1可以吗? 是的,locationManager:didEnterRegion: 被调用,您的应用程序进入后台 5 秒,您现在可以通过 beginBackgroundTaskWithExpirationHandler: 请求更多时间并进行服务器调用或任何您需要的操作。 奇怪的是,当我的应用程序在后台运行时触发一个区域时,我的音频会避开其他音频并在后台播放,但最近似乎该应用程序(即使滑动关闭)避开其他音频,(不播放音频)然后取消它,就像它即将播放音乐但它并没有......很奇怪;并不好,因为我的一个用户已经抱怨过这个......当应用程序被滑动关闭时,区域箭头仍然存在,并且这些区域肯定仍在受到监控。这仍然是一个错误(iOS 7.1.x)

以上是关于ios 7 中的区域监控的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 中的 didEnterRegion - 区域监控

CLLocation 区域监控在 iOS 5.1 和 iOS 6 中的行为不同

监控重叠区域

后台模式下的 iOS 区域监控

iOS5 区域监控准确率

使用 CLOcationManager (iOS) 监控 20 多个区域 [重复]