在底部(在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);
}
答案 0 :(得分:2)
首先,您应该添加以下位置管理器委托方法,并查看由于某种原因区域监控注册失败:
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {
NSLog(@"%@",error);
}
其次,区域监控是系统共享资源。 该文档指出,它允许您监控有限数量的区域(不幸地不指定任何数字),并提到如果另一个应用程序注册要监控的其他区域,您的某些应用程序监控区域可能会被丢弃。
第三,区域监测没有使用任何GPS技术。它只使用网络运营商的蜂窝天线,无论何时更换蜂窝塔,它都会触发一个循环遍历所有受监控区域的系统事件,并查看某个区域是否位于您现在所在的新区域内。
这意味着您应该期望服务的准确性降低,因此您应该增加为区域设置的半径。
最后,如果您的应用已完全终止且未暂停,那么您的应用将在应用代理中收到:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
UIApplicationLaunchOptionsLocationKey
字典中的launchOptions
。
在您的应用程序实时状态的有限时间内,您有责任重新初始化您的位置管理员,获取当前位置并向用户发送本地推送通知。
由于应用程序不会在该阶段正常运行,但处于有限的后台模式状态。
此外,如果您想在模拟器中测试应用程序,则应将track.gpx文件添加到项目中,并将模拟器设置为跟踪模式。 确保放置在模拟器中的2个位置不是很远(因为完成跟踪可能需要很长时间)并将它们设置在路径中,它将进入受监控区域。 然后看看你是否得到任何回调。 不要使用您的设备进行测试,因为您需要实际走几个街区以查看与设备的任何真实互动: - )
答案 1 :(得分:0)
不完全确定为什么它不会收到你的回调。我会介绍一些我注意到的事情,你可以看看他们是否有所帮助。
desiredAccuracy
或distanceFilter
。它们应该默认为某些东西,但是如果你在GPX中的位置不在区域的准确度范围内,那么它可能不会足够接近触发。CLRegion
进行监控regionToMonitor
会很有帮助。如果一旦开始监视就创建好了,您应该会看到空心的紫色位置箭头。您还应该收到代理人电话-didStartMonitoringForRegion
。如果这些都没有出现,那么您可能只是遇到了您的位置管理器设置问题。我没有看到你所包含的代码有什么问题,所以我猜测问题在于你没有包含的代码。检查以确保您的位置管理器代码已初始化,并确保正确创建CLRegion
。希望这可以帮助。如果您包含更多代码并且我们发现真正的问题是什么,我将很乐意更新我的答案。