核心位置在iOS 8中不起作用

时间:2014-07-21 21:20:37

标签: ios cocoa-touch core-location ios8

我试图在iOS 8中使用重要的更改位置监控,但永远不会调用didUpdateLocations方法。以下是设置位置管理器的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    [locationManager requestWhenInUseAuthorization];
    [locationManager startMonitoringSignificantLocationChanges];
}

尽管调用了requestWhenInUseAuthorization,但没有任何内容弹出来要求用户对其进行授权。我已经设置了NSLocationWhenInUseUsageDescription,它仍然无效。 didChangeAuthorizationStatusdidFailWithError也永远不会被调用。 编辑:我能够让它要求用户允许位置服务,但即使你点击允许它也从不显示位置。

8 个答案:

答案 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

enter image description here

答案 2 :(得分:4)

进入.plist文件添加 enter image description here

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)

尝试

  1. 功能背景模式

  2. #import <CoreLocation/CoreLocation.h>

  3. <CLLocationManagerDelegate>

  4. locationManager = [[CLLocationManager alloc] init]; [locationManager setDelegate:(id)self]; [locationManager requestWhenInUseAuthorization];

    在应用程序的开头

  5. plist中的
  6. NSLocationWhenInUseUsageDescription

  7. 尝试CMD + SHIFT + K

  8. 尝试关闭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。