我正在尝试制作一个基于位置的应用,需要在打开后不断更新位置。当应用程序关闭时我正在寻找一种方法将位置保留在后台,我发现这不是最好的方法,因为它会很快从任何iPhone上耗尽电池。
总而言之,我发现“区域监控”,因为我已经了解它们与苹果公司用于他们的应用程序“提醒”同样适用于位置相同。然后我使用该选项来测试我的应用程序,我意识到在模拟器中“永远”不会输入方法“didEnterRegion”,尽管它已正确创建:
-(void) locationManager: (CLLocationManager *) manager didEnterRegion: (CLRegion *) region
{
NSLog (@ "entering the region");
CLLocation * location1 = manager.location;
CLLocation * location2 = [[CLLocation alloc] initWithLatitude: latitud.doubleValue longitude: longitud.doubleValue];
}
我终于意识到这个方法被调用了,但只有当我走开大部分区域并且我回到该区域时,表明它不起作用,因为我已经在那个位置(所有这些都在模拟器中),奇怪的是,事实并非如此,模拟器的位置距离监控区域只有几英里!这导致我认为这是准确性的问题,尽管创建半径为50或100米的区域正在蔓延3或4公里,所以我没用。
有没有人有经验,知道iOS 6模拟器是否有此错误或精度问题?我还没有开发人员许可证才能直接在我的iPhone上测试它,我不想买它因为我的应用程序还远没有完成,我感谢你对这个主题的任何帮助。
提前致谢。
答案 0 :(得分:2)
我建议做实际的地面测试。区域监控精度因测试位置而异。
第二个选项是使用区域监控来唤醒应用程序并启动标准位置服务。为此,您需要获得在后台运行应用程序的权限。 Apple可能不会批准这一点。我们的应用程序被这种方法拒绝了。
答案 1 :(得分:2)
DidEnterRegion和ExitRegion不是很准确。大约+, - 150米精度。
但是 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)位置 非常准确。使用它来找出您的区域有坐标/当前位置
CLLocation *currentLocation = [locations lastObject];
if ([self.ARegionYouSetBeforeHand containsCoordinate:currentLocation.coordinate])
{
//you arrived at this region!!
}
答案 2 :(得分:1)
区域监控(通常)与“重要位置变更”位置服务的工作基础相同。也就是说,它使用了蜂窝塔的位置; Apple建议您通常可以预期1公里左右的准确度,但警告实际精确度将随您所在地区的手机信号塔密度而变化。您可以在核心位置WWDC videos上找到有关此主题的更多背景信息。
这可能是可行的 - 我没有尝试过 - 使用区域监控(唤醒你的应用程序)对用户的位置进行一般猜测,然后在CLLocationManager
中使用更高精度的模式得到更精确的修复。
答案 3 :(得分:0)
完成后我意识到区域监控的准确性对于大多数用途来说是好的,但是在模拟器中可能会很棘手,因为它没有GPS或手机硬件,无论如何当我在我的设备中使用“区域监控”时甚至在模拟路线功能正常工作。
为了更准确,我调用了CLLocationManager的方法“startUpdatingLocation”到方法“didEnterRegion”,这对我来说很有用。
答案 4 :(得分:0)
我在iPhone 5C上使用蜂窝塔移动数据进行区域监控时遇到了同样的问题,禁用了WiFi,我很快就被调用了很快就被调用了,当我距离我保留区域的监控点1.95公里时半径100.0米。这太早了。
Apple的某些阈值由当前可用的硬件和位置技术决定。所以对我而言,早期价值可能在1800米左右。
我建议保持半径最小(例如500.0区域为25.0)或者如果它是如此珍贵的通知,请使用didUpdateLocations委托方法并确定您的区域并通知相同的。
此致 考希克
答案 5 :(得分:0)
我发现内置区域监控不够准确,无法满足我的需求。如果你需要更高的准确度,首先要适当地设置你的准确度,然后你可以使用这样的东西:
(使用与@ coolcool1994相同的方法,但更深入一点并使用Swift 2.1。请记住设置CLLocationManager
及其Delegate(以下函数所在的位置),并开始接收位置更新)
var activeRegions = Set<String>()
var monitoredRegions = [
CLCircularRegion(center: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0),
radius: 300, identifier: "Region1"),
CLCircularRegion(center: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0),
radius: 300, identifier: "Region2")
]
func manuallyUpdateActiveRegionsFromLocation(location: CLLocation){
// Optionally explicitly reject unwanted location updates
// Setting the location manager delegate's desiredAccuracy should be enough
let maxOldTime = 300 //5 minutes
let minAccuracy = 300 //300 metres
if abs(location.timestamp.timeIntervalSinceNow) > maxOldTime
|| location.horizontalAccuracy > minAccuracy {
return
}
for monitoredRegion in monitoredRegions {
if monitoredRegion.containsCoordinate(location.coordinate) {
activeRegions.insert(monitoredRegion.identifier)
} else {
activeRegions.remove(monitoredRegion.identifier)
}
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
manuallyUpdateActiveRegionsFromLocation(location)
}
}
答案 6 :(得分:0)
MK MapView上预定义的GPS准确度
kCLLocationAccuracyBestForNavigation - 使用尽可能高的
额外的传感器数据增加了准确度。
kCLLocationAccuracyBest - 建议的最高级别为
使用电池供电的设备的准确度。
kCLLocationAccuracyNearestTenMeters - 精确到10米以内。
CLLocationAccuracyHundredMeters - 精确到100米以内。
kCLLocationAccuracyKilometer - 准确到一公里以内。
kCLLocationAccuracyThreeKilometers - 准确到三个以内 公里。
<强>用法:强>
var locationManager: CLLocationManager = CLLocationManager()
//MapView Location
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()