didUpdateLocations未被调用

5

我将我的对象设置为locationManager的代理,并调用了didChangeAuthorizationStatus方法,它执行以下操作:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == CLAuthorizationStatus.AuthorizedWhenInUse {
        self.locationManager.startUpdatingLocation()
    }
}

我还有另一种方法,但在此之后从未被调用过:
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    if locations.count == 0 {
        return
    }

    //Do stuff
}

有什么想法,为什么这个方法没有被调用?我想被释放的对象可能是一个选项,但是当它到达authorizationStatus方法时,它也将被释放。


这是在其他地方完成的,并导致第一个委托方法被调用。 - Andrew
3个回答

23

虽然现在回答有点晚,但是我在遇到相同问题时也偶然间发现了这个帖子(didChangeAuthorizationStatus 被调用但是 didUpdateLocations 没有被调用)。当然,这不是代码相关的问题,而是因为我在模拟器上测试,而模拟器没有设置位置。因此位置永远无法找到,导致 didUpdateLocations 从未被调用。

要解决这个问题...在模拟器中进入 Debug -> Location-> <choose location>.

修改 需要注意的是,如果模拟器中没有设置位置,则会运行 locationManager:didFailWithError:。这是你所期望的。


另外一件事是,您不应同时拥有NSLocationWhenInUsageDescription和NSLocationAlwaysInUsageDescription。我实际上不确定这是否有所区别,但删除NSLocationAlwaysInUsageDescription似乎对我有所帮助。 - tryingtolearn

6

这在iOS 10iOS 11上都可以使用。

创建一个CLLocationManager属性,使用strong来修饰,并添加CLLocationManagerDelegate

@property (strong, nonatomic) CLLocationManager *locationManager;

将以下属性添加到您的 info.plist 文件中。
Privacy - Location When In Use Usage Description
Privacy - Location Always Usage Description
Privacy - Location Usage Description

将下面的方法添加到您的.m文件中:

-(void)getCurrentLocation
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate=self;
    self.locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    self.locationManager.distanceFilter=kCLDistanceFilterNone;
    [self.locationManager requestWhenInUseAuthorization];
    [self.locationManager startMonitoringSignificantLocationChanges];
    [self.locationManager startUpdatingLocation];
}

只需调用 [self getCurrentLocation] 方法即可。


0
这是我应用程序的一小段代码:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    ...
    locationManager.delegate = self
    locationManager.activityType = CLActivityType.Fitness
    locationManager.distanceFilter = 10   // 10m
    locationManager.requestAlwaysAuthorization()

    // get current location
    if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.Authorized {
        locationManager.startUpdatingLocation()
    }
}

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == .Authorized {
        locationManager.startUpdatingLocation()
    }
}

在iOS 8及以上版本中,您必须在Info.plist文件中添加NSLocationAlwaysUsageDescription键,并将其值设置为授权问题。这是一个要求。


我已经完成了这个,导致第一个方法被调用。 - Andrew
你确定已经允许使用位置服务了吗?请检查设置应用程序中的隐私设置。或者尝试完全卸载并重新安装该应用程序,这样您将再次被要求授权。 - zisoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接