我在SpringBoard或imagent中使用CLLocationManager,但是当我分配CLLocationManager时,我得到了错误with:depending on legacy on-demand authorization, which is not supported for new apps
。即使在定位过程中,我也遇到了同样的情况......
%hook SpringBoard
-(void)applicationDidFinishLaunching: (id)application {
CLLocationManager *locationMgr = [[CLLocationManager alloc] init];
%orig;
}
%end
问题是我如何在这样的过程中获取位置信息?或者,我是否可以更改应用程序的权利?
这一切都是由于iOS 8的变化。在以前的iOS版本上,至少有locationd
具有com.apple.locationd.preauthorized
权利,该权利可以在未经用户许可的情况下访问位置。现在连locationd
都没有。与SpringBoard
和imagent
相同.当然,locationd
它可以通过自己的API访问位置 - locationd
是位置守护进程,可以处理从授权到过滤和处理来自各种来源的原始位置数据的所有内容。
您可以更改他们的Info.plist
但它不会做太多事情 - 这些应用程序仍然不会被授权。使用SpringBoard
,您必须显示默认警报以允许其访问位置。有了locationd
和imagent
你可能什么都做不了——它们是守护进程。守护程序没有 UI,因此它们无法显示任何警报来请求权限。为了解决这个问题,守护程序使用权利在没有用户许可的情况下访问某些内容(如个人信息)。
现在,除了请求用户的权限之外,如何解决它SpringBoard
:
- 编写使用
com.apple.locationd.preauthorized
授权签名的您自己的守护进程。这样,您可以在没有任何权限的情况下访问位置。默认情况下,您的守护程序将始终被授权这样做。 - 使用
com.apple.locationd.preauthorized
重新签名系统应用程序。这是一种黑客,在这种情况下,我个人反对,因为编写守护进程可以解决所有问题。如果您仍然想这样做,请在此处阅读我的答案