CoreLocation AttributeError

时间:2015-04-20 18:47:40

标签: python objective-c core-location

我正在尝试使用以下python脚本找到我Mac的当前位置。它使用的是python objective-C桥,它有时会起作用。但是有时候我会得到以下的AttributeError,而且我不确定应该怎么做来修复错误。

#!/usr/bin/python
# encoding: utf-8

import CoreLocation
manager = CoreLocation.CLLocationManager.alloc().init()
manager.delegate()
manager.startUpdatingLocation()
coord = manager.location().coordinate()
lat, lon = coord.latitude, coord.longitude
print lat, lon

以下错误:

Traceback (most recent call last):
  File "Desktop/SimpleCoreServices.py", line 11, in <module>
    coord = manager.location().coordinate()
AttributeError: 'NoneType' object has no attribute 'coordinate'

Apple's developer documentation并没有帮助我,因为我的Objective-C并不强大。

1 个答案:

答案 0 :(得分:0)

您应等待locationd提示您进行位置访问。然后允许python使用位置服务。我在您的代码中添加了一个等待块:

import CoreLocation
from time import sleep

manager = CoreLocation.CLLocationManager.alloc().init()
manager.delegate()
manager.startUpdatingLocation()
while CoreLocation.CLLocationManager.authorizationStatus() != 3 or manager.location() is None:
    sleep(.1)
coord = manager.location().coordinate()
lat, lon = coord.latitude, coord.longitude
print (lat, lon)

在循环等待authorizationStatus并在location中获取值时,将显示提示。有时大约需要30秒才能显示该对话框:

Location access prompt

如果用户通过选择“允许”接受访问,则authorizationStatus的值将变为3。此后,循环将继续等待,直到获得位置值为止。

不幸的是,有时无法通过“系统偏好设置”中的“安全性和隐私”部分控制访问。由于“定位服务”列表中的python行消失了,因此无法选中或取消选中它。另外,tccutil shell命令无法控制它。

如果您不小心选择了“不允许”按钮,则可以使用these说明进行重置。