为什么我的CLLocationManager不响应startMonitoringForRegion?

4

在底部(在AppDelegate.m中),您可以看到我的CLLocationManager委托方法,但它们中的任何一个都没有被调用。我正在使用GPX文件,但即使区域未进入或退出,委托方法didStartMonitoringForRegion也应该被调用。

SomeOtherClass.m

AppDelegate appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.locationManager startMonitoringForRegion:regionToMonitor desiredAccuracy:kCLLocationAccuracyNearestTenMeters];

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate>
@property (nonatomic, retain) CLLocationManager *locationManager;

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (locationManager==nil) {
        locationManager = [[CLLocationManager alloc] init];  
        locationManager.delegate = self;
    }

    return YES;
}

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"Did enter region");
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"Did exit region");
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Fail");
    NSLog(@"%@", [error description]);
}

-(void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    NSLog(@"Did start monitoring for region: %@", region.identifier);
}

你是否在你的位置管理器上检查了 + (BOOL)regionMonitoringAvailable+ (BOOL)regionMonitoringEnabled - David Rönnqvist
1
@DavidRönnqvist 我刚刚测试了,两个都是正确的。 - Pieter
我也遇到了同样的问题。奇怪的是,该区域被正确地监测,并且出现在“monitoredRegions”中... 我有一种隐隐的感觉,这只会在不同的CLLocationManager添加区域时调用(因为它们在整个应用程序中共享)... - Ben Mosher
2个回答

2

首先,您应该添加以下位置管理器委托方法,并查看是否由于某种原因导致区域监视注册失败:

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {
    NSLog(@"%@",error);
}

第二,区域监控是一种共享系统资源。文档指出它允许您监控有限数量的区域(不幸的是没有具体数字),并提到如果另一个应用程序注册了额外的监控区域,则您的应用程序监控的某些区域可能会被丢弃。
第三,区域监控不使用任何GPS技术。它只使用您的网络运营商的蜂窝天线,每当您更换一个基站时,它就会触发一个系统事件,循环遍历所有监控的区域,并查看该区域是否在您现在所在的新区域内。
这意味着您应该预期服务的准确性较低,因此应增加您设置的区域半径。
最后,如果您的应用程序完全终止而不是挂起,则您的应用程序将在app delegate中接收以下内容:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

launchOptions字典中,有一个UIApplicationLaunchOptionsLocationKey。此时,您需要重新初始化位置管理器,并在应用程序的有限生存状态内获取当前位置并向用户发送本地推送通知。

由于该应用程序此时不会以正常模式运行,而是处于有限的后台模式状态。

如果您想在模拟器中测试应用程序,则应将track.gpx文件添加到您的项目中,并将模拟器设置为跟踪模式。确保您放置在模拟器中的2个位置不是非常遥远的(因为跟踪可能需要很长时间才能完成),并将它们设置在路径中,以便进入您监视的区域。然后查看是否收到任何回调。请勿使用设备进行测试,因为您需要实际步行几个街区才能看到与设备的任何真正交互 :-)


0

不太确定为什么它无法接收您的回调。我会讲解一些我注意到的事情,您可以看看它们是否有所帮助。

  1. 您没有在位置管理器中设置desiredAccuracydistanceFilter。它们应该默认为某些值,但如果您的GPX中的位置不在区域的准确度范围内,可能只是因为它没有足够接近触发。
  2. 您正在使用的启动监视的方法已在iOS 6中被弃用。您可以将精度添加到位置管理器中,并将其从调用中省略。
  3. 看看您如何创建要监视的CLRegion,即regionToMonitor,会很有帮助。如果它在开始监视时被正确创建,您应该会看到空心紫色定位箭头出现。您还应该收到委托调用-didStartMonitoringForRegion。如果这两者都没有显示,则您可能只是在位置管理器设置方面存在问题。
  4. 一个建议是创建自己的位置管理器类并将其转换为单例。这将防止您意外初始化多个委托并获得多个调用。它还为您提供了一个干净的类来包含所有回调方法。
我看不出你所包含的代码有什么问题,所以我猜测问题可能在你没有包含的代码中。请检查确保你的位置管理器代码被初始化,并确保你的CLRegion被正确创建。希望这可以帮到你。如果你包含更多的代码并且我们找到了真正的问题,我很乐意更新我的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接