我试图在iOS 8中使用重要的更改位置监控,但永远不会调用didUpdateLocations方法。以下是设置位置管理器的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager requestWhenInUseAuthorization];
[locationManager startMonitoringSignificantLocationChanges];
}
尽管调用了requestWhenInUseAuthorization
,但没有任何内容弹出来要求用户对其进行授权。我已经设置了NSLocationWhenInUseUsageDescription,它仍然无效。 didChangeAuthorizationStatus
和didFailWithError
也永远不会被调用。
编辑:我能够让它要求用户允许位置服务,但即使你点击允许它也从不显示位置。
答案 0 :(得分:17)
目前iOS8 beta5中存在一个错误,该错误始终会停用您应用的地理定位服务(至少对我来说是这样)。
进入settings > Privacy > Location services > Your app > Always
。
但我不知道为什么,但即使您将其设置为Always
,此设置也会自动停用,因此请耐心等待并经常返回设置以再次配置您的应用位置。
答案 1 :(得分:11)
尝试在头文件中声明CLLocationManager *locationManager
,然后就可以了。除非我已将其声明为全局变量,否则它不会要求权限和更新位置。
·H
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <CLLocationManagerDelegate>
{
CLLocationManager *locationManager;
}
的.m
- (void)viewDidLoad {
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:(id)self];
[locationManager requestWhenInUseAuthorization];
[locationManager startMonitoringSignificantLocationChanges];
[locationManager startUpdatingLocation];
}
委派方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
NSLog(@"Getting Location");
}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"%@", error.localizedDescription);
}
info.plis
答案 2 :(得分:4)
进入.plist文件添加
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
if(IS_OS_8_OR_LATER)
{
if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[locationManager requestWhenInUseAuthorization];
}
}
[locationManager startUpdatingLocation];
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
currentLocation = [locations lastObject];
}
答案 3 :(得分:2)
所有步骤看起来都已完成,但只有在您检查:didChangeAuthorizationStatus 后才会运行:startUpdatingLocation 。
此时,请确保authorizationStatus不是 kCLAuthorizationStatusNotDetermined 或 kCLAuthorizationStatusDenied 。
如果是,请检查info.plist中的字符串条目。
如果您认为所有内容都正确无误,请务必从设备中卸载该应用。 执行干净的构建,然后在设备上运行应用程序。
答案 4 :(得分:2)
我有一个类似的问题将我的应用迁移到iOS 8。 由于原始代码基于Apple提供的示例代码 https://developer.apple.com/library/ios/samplecode/GeocoderDemo/Introduction/Intro.html 我检查了它是否已经更新了。主要区别在于此功能与iOS 8相关的位,已被评论。这对我有用。
- (void)startUpdatingCurrentLocation
{
// if location services are restricted do nothing
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied ||
[CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted )
{
return;
}
// if locationManager does not currently exist, create it
if (self.locationManager == nil)
{
_locationManager = [[CLLocationManager alloc] init];
[self.locationManager setDelegate:self];
self.locationManager.distanceFilter = 10.0f; // we don't need to be any more accurate than 10m
}
// for iOS 8, specific user level permission is required,
// "when-in-use" authorization grants access to the user's location
//
// important: be sure to include NSLocationWhenInUseUsageDescription along with its
// explanation string in your Info.plist or startUpdatingLocation will not work.
//
if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[_locationManager requestWhenInUseAuthorization];
}
[_locationManager startUpdatingLocation];
[self showCurrentLocationSpinner:YES];
}
答案 5 :(得分:1)
尝试
功能背景模式
#import <CoreLocation/CoreLocation.h>
<CLLocationManagerDelegate>
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:(id)self];
[locationManager requestWhenInUseAuthorization];
在应用程序的开头
NSLocationWhenInUseUsageDescription
尝试CMD + SHIFT + K
尝试关闭iPhone然后再打开 - 他在iOS 8中有一些现金 - 所以经过5次 - 应用程序不要求核心位置的许可 - 这对我帮助< / p>
答案 6 :(得分:1)
可能的原因是,为什么授权对话框没有与OP代码一起显示,是位置管理员必须留下来让它工作。
使用属性或静态变量将locationManager
保留在内存中。
答案 7 :(得分:0)
也许是因为 WhenInUseAuthorization 不足以进行&#34; 重要位置变更&#34;更新。
当我使用 AlwaysAuthorization 时,它就可以了。
我在文档中找不到它。但您可以查看http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/。在&#34;授权类型&#34;标题,它指出重要的位置更新需要AlwaysAuthorization。