我试图在我的应用程序中获取我所在位置的海拔高度。但是每次我尝试对象的altitude属性时,CLLocation我都会得到0.00结果。
我用谷歌搜索我的查询,我在这里和这里得到了一个类似的问题。此链接表示,如果我使用 wifi 或蜂窝塔访问 CLLocation,它将为空。即使我尝试设置desireAccuracy为最佳,也不能确保该应用程序将使用 GPS。它还说如果我在室内,我将无法访问 GPS。
在很多情况下,它不确定该应用程序将仅使用 GPS。我也想要一些从 wifi 或手机信号塔获取 Altitude 的方法。为此,我搜索了更多,并获得了Google Earth API,但我认为这仅适用于 Microsoft .net 技术。
现在根据这种情况,我认为对于一个解决方案,我可以在 Microsoft Technology 中创建一个 Web 服务并在那里传递我的位置,我可以获得高度作为响应,但我不想这样做。
谁能建议我如何从ios获取我的位置高度。有没有什么方法可用或不可用?如果是,请导航我正确的方向。
提前致谢。
编辑1
我用于CLLocationManager更新位置,当我得到我的位置时,我需要高度。
编辑2
根据@fishinear 的回答,我尝试了以下代码:
- (void)viewDidLoad
{
[super viewDidLoad];
manager = [[CLLocationManager alloc] init];
[manager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[manager setDistanceFilter:kCLDistanceFilterNone];
[manager setDelegate:self];
[manager startUpdatingLocation];
// Do any additional setup after loading the view, typically from a nib.
}
- …Run Code Online (Sandbox Code Playgroud) 我见过Android开发人员可以获得GPS位置的准确性.有没有办法让我在iOS中获得我当前GPS定位的准确性?
我正在使用此答案中的代码来获取我的位置:
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"OldLocation %f %f", oldLocation.coordinate.latitude, oldLocation.coordinate.longitude);
NSLog(@"NewLocation %f %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}
Run Code Online (Sandbox Code Playgroud) 我要求如果我的应用程序从后台模式终止,之后如果发生任何重要的位置更改,它应该以后台模式启动.这就是文件中的确切陈述startMonitoringSignificantLocationChanges
如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台.在这种情况下,传递给应用程序的选项字典:didFinishLaunchingWithOptions:应用程序委托的方法包含密钥UIApplicationLaunchOptionsLocationKey,以指示您的应用程序是由于位置事件而启动的.重新启动后,您仍必须配置位置管理器对象并调用此方法以继续接收位置事件.重新启动位置服务时,会立即将当前事件传递给您的代理.此外,即使在启动位置服务之前,也会使用最新的位置对象填充位置管理器对象的位置属性.
所以我把这段代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([CLLocationManager significantLocationChangeMonitoringAvailable]) {
// Stop normal location updates and start significant location change updates for battery efficiency.
[viewController.locationManager stopUpdatingLocation];
[viewController.locationManager startMonitoringSignificantLocationChanges];
//NSLog(@"significantLocationChangeMonitoringAvailable.");
}
else {
//NSLog(@"Significant location change monitoring is not available.");
}
}
Run Code Online (Sandbox Code Playgroud)
之后,虽然我试图在漫游之后改变我的位置,但它还没有在后台模式中重新启动.
我在这里遗失或误导的是什么?该应用程序没有在后台重新启动
有什么建议?
编辑2013年7月12日
经过这么多次试验后,我发现应用程序在使用崩溃日志重新启动后立即崩溃
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x3ba3feb4 mach_msg_trap + 20
1 libsystem_kernel.dylib 0x3ba40048 mach_msg + 36
2 CoreFoundation 0x337ff040 __CFRunLoopServiceMachPort + 124
3 CoreFoundation 0x337fdd9e __CFRunLoopRun …Run Code Online (Sandbox Code Playgroud) iphone objective-c core-location cllocationmanager cllocation
我已经创建了一个框架,负责注册CLBeaconRegions,并在范围内时,对CLBeacons进行测距,然后发送UILocalNotification.当我使用实际的类编译应用程序时,它应该工作,但是当我在胖静态库中编译应用程序时,它不会.
框架的作用:1.CLBeaconRegion的EnterRegion事件2.开始测距3.范围信标4.提供UILocalNotification
在具有实际类的应用程序中测试它时,它在前台和后台都有效.
在具有胖库的应用程序中测试时,它在后台运行,有时仅在前台运行.
知道这可能是什么问题吗?
您好,我正在 iOS 应用程序中使用位置,我设置的精度如下:
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
Run Code Online (Sandbox Code Playgroud)
我正在使用这个函数来检查准确性
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(manager.location!.horizontalAccuracy)
if locations.last!.horizontalAccuracy <= manager.desiredAccuracy{
print(manager.location)
location = locations.last!
locationManager.stopUpdatingLocation()
locationManager = nil
}
}
Run Code Online (Sandbox Code Playgroud)
问题是精度叠加到 1414 而永远不会达到 100。有什么方法可以解决这个问题吗?
在回答关于 SO 的另一个问题时,我发现CLLocation该类符合Equatable协议。它使用什么方法来确定相等性?
纬度/经度的精确匹配?纬度/经度和高度的精确匹配?纬度、经度、高度和时间戳的精确匹配?速度和路线呢?什么CLLocation是单纯用纬度/经度对创建的对象?位置的各种其他值不是可选的,那么使用创建的位置的海拔高度是init(latitude:longitude:)多少?
我试图将 CLLocationCoordinates2d 坐标转换为物理街道地址。
我试过 CLGeocoder 没有运气。这是我提供纬度和经度坐标的代码。
let manager = CLLocationManager()
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
// let locationtext = "locations = \(locValue.latitude) \(locValue.longitude)"
locationTxt.text = "\(locValue.latitude) \(locValue.longitude)"
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我们在代码中使用函数 CLLocationManager protectedRegions
public func getMonitoredRegions() -> Set<CLRegion> {
return locationManager.monitoredRegions
}
Run Code Online (Sandbox Code Playgroud)
我们以这种方式使用这个函数
for region in locationManager.getMonitoredRegions() where condition(region) {
...
}
Run Code Online (Sandbox Code Playgroud)
我们注意到,当使用以下 Crashlytics 日志调用 CLLocationManager protectedRegions 时,我们的应用程序崩溃了:
#12. Crashed: our.queue.name.here
EXC_BAD_ACCESS KERN_PROTECTION_FAILURE 0x000000016aecffe0
0 libsystem_malloc.dylib 0x191d9bfb4 nanov2_malloc$VARIANT$armv81 + 138
1 libsystem_malloc.dylib 0x191d9c540 nanov2_calloc$VARIANT$armv81 + 136
2 libsystem_malloc.dylib 0x191da9b74 malloc_zone_calloc + 140
3 libsystem_malloc.dylib 0x191daa3fc calloc + 40
4 libobjc.A.dylib 0x1913ac554 class_createInstance + 72
5 libdispatch.dylib 0x191c05ad8 _os_object_alloc_realized + 40
6 libdispatch.dylib 0x191bd9594 <redacted> + 108
7 libdispatch.dylib 0x191bd78ac <redacted> …Run Code Online (Sandbox Code Playgroud) 我正在开发一个iPhone应用程序,这是一个位置感知应用程序.Currentlly应用程序正常工作,除了以前位置的缓存.我第一次启动应用程序位置管理器获取当前位置,然后根据当前位置显示附近的内容.
但从下一个它使用以前获取的位置,直到我重新启动手机它将获取相同的位置.所以到目前为止,我很清楚位置管理器会缓存该位置.
所以我的问题是如何删除此缓存并强制位置管理器获取新位置谢谢
我不明白这个例子来自doc:timeIntervalSinceNow方法应该显示一个正值,但是我们怎么能达到代码中提到的"5"?(我认为它或者更多或更少,或者-10,-20,-30等...但是我们怎样才能获得正值,例如5?):
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
// test the age of the location measurement to determine if the measurement is cached
// in most cases you will not want to rely on cached measurements
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
if (locationAge > 5.0) return;
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助