我使用geocodeAddressString:completionHandler:方法,它返回一个CLPlacemarks数组。 我必须得到纬度,经度,记忆名称和半径。 获得前3个很容易: double lat = placemark.location.coordinate.latitude; double lng = placemark.location.coordinate.longitude; NSString *name = [NSString stringWithFormat:@"%@", ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO)] 我不知道如何获得半径现在,因为placemark.region.radius已被弃用。 任何想法现在使用什么呢? 在文档中我找不到任何有趣的东西。
从我可以从苹果示例区域监控代码的运行时需求中解释,区域监控可用于iPhone 4,iPad 2 Wifi + 3G或更高版本。 所以我假设它不适用于3G或iPhone 3G / 3GS的iPad1。 这是一个正确的解释? 我不能testing这个,因为我没有所有这些设备,我找不到这个官方文档。 PS:我知道我可以通过调用regionMonitoringAvailable方法在代码中检查它,但是我需要这些信息来决定我的应用程序的体系结构,所以我需要知道这一点。
我一直无法解决如何处理手机已经在区域内的情况下startMonitoringForRegion被称为? 其他问题已经build议在didStartMonitoringForRegion调用requestStateForRegion然后调用方法didDetermineState: forRegion: 所以代码看起来像这样: – (void)viewDidLoad { //location manager set up etc… for (Object *object in allObjects){ CLRegion *region = [self geofenceRegion:object]; [locationManager startMonitoringForRegion:region]; } } – (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { [self.locationManager requestStateForRegion:region]; [self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5]; } – (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { if (state == CLRegionStateInside){ [self locationManager:locationManager didEnterRegion:region]; } } […]
我正在创build一个应用程序,告诉用户他们是否在目的地附近。 我正在计算currentLocation和目的地之间的距离。 我正在做didUpdateLocations里面的didUpdateLocations 。 它正在工作,但我已经看到,有一些方法可以处理,而不需要做任何的math计算。 我正在注册CLLocationManager的区域; 但是,似乎didExitRegion和didEnterRegion方法没有被调用。 以下是我注册地区的部分代码: – (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self.locationManager startUpdatingLocation]; [self.mySearchBar resignFirstResponder]; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; self.distToRemind = 0; [worldMap removeAnnotations:[worldMap annotations]]; NSLog(@"executou de primeira"); CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder geocodeAddressString:[self.mySearchBar text] completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *placemark = [placemarks lastObject]; //test //DefaultAnnotation *annot = [[DefaultAnnotation alloc] initWithCoordinate:placemark.location.coordinate andTitle:@""]; […]
我想要非常精确地调用didEnterRegion,但是我无法做到这一点。 以下是我所做的:我使用了distanceFilter和desiredAccuracy(根据Apple的最精确的GPS设置)的最佳值,并且具有目的地CLCircularRegion(CLRegion的子类)。 self.locationManager.distanceFilter = kCLLocationAccuracyBestForNavigation; self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; @property (nonatomic, strong) CLCircularRegion *Destination; self.Destination = [[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(43.907691, -69.963158) radius:5 identifier:@"Destination"]; [self.locationManager startMonitoringForRegion:self.Destination]; 问题是当我离这个目的地150米远时,didEnterRegion被调用。 也在类似的距离离开didExitRegion被调用。 我想要在5米以外,而不是150米以外的地方调用didEnter和didExit区域,因为我已经指定了CLCircularRegion的启动。 有没有人有办法解决吗? 精度是我需要的,150米而不是5米对我来说太不准确了。 谢谢吨 – (我用iPhone 4S来testing)
我试图testing区域监控,因为我得到这样的当前位置: – (void)startLocationTracking { CLLocationManager *locationManager = [[CLLocationManager alloc] init]; // Start location manager if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { locationManager = [LocationTracker sharedLocationManager]; locationManager.delegate = self; [locationManager startMonitoringSignificantLocationChanges]; } } 跟踪像这样的区域监视的第一个位置: -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:manager.location.coordinate radius:300 identifier:@"first location initializer"]; […]
如果应用程序正在运行,并且CLLocationManagerDelegate类是前景(即可见),则会触发didEnterRegions,并同时获得NSLog和AlertView。 但是,当应用程序处于后台时,我什么也得不到,实质上,如果屏幕显示除委托类以外的任何内容。 我已经在plist的“所需的背景模式”下设置了“位置更新的应用程序寄存器”,尽pipe我不确定这是甚至是必要的。 这是我认为是相关的代码,虽然我可能是错的(并很乐意添加更多)。 我应该注意,viewDidLoad中的所有内容都包含在一个if中,以检查区域监视是否可用和启用。 – (void)viewDidLoad { NSLog(@"MapViewController – viewDidLoad"); self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; self.locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters; self.locationManager.delegate = self; [self.locationManager startMonitoringSignificantLocationChanges]; } – (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { NSLog(@"MapViewController – didEnterRegion"); NSLog(@"MVC – didEnterRegion – region.radius = %f", region.radius); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"entered region…" message:@"You have Entered the Location." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: […]
我正在使用NavigationController来显示用户可用的地理围栏列表。 在顶部有一个全局开关,我想用来禁用CoreLocation -startMonitoringForRegion注册的所有防护。 我的篱笆似乎很好,并且大部分都在工作,但是无论我个别禁用篱笆多less次,我仍然会看到紫色的位置箭头,表示系统仍在监视我的位置和/或围栏。 当我单独禁用我的篱笆时,这就是我正在做的事情。 CLLocationCoordinate2D coord; coord.latitude = [[settingsData valueForKey:@"latitude"] doubleValue]; coord.longitude = [[settingsData valueForKey:@"longitude"] doubleValue]; CLLocationDistance radius = [[settingsData valueForKey:@"radius"] intValue]; CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:coord radius:radius identifier:[settingsData valueForKey:@"name"]]; // remove this fence from system monitoring [locationManager stopMonitoringForRegion:region]; [region release]; 我已经浏览了苹果关于CoreLocation的所有文档以及这些方法的使用,而且我已经走到了尽头。 我试过调用[locationManager monitoredRegions]; 但它只返回活动的栅栏,只有当我有我的细节视图加载。 我不能在我的程序中调用任何其他地方,并让它返回我的任何围栏,即使我知道他们应该积极。 如果任何人有任何build议去下一个,我都耳朵。