4

我正在编写一个类似于Chris Alvares daemon的守护进程。我想在未经用户许可的情况下在后台获取设备位置。如果“设置”中的Location Services首选项设置为,ON那么我可以毫无问题地获取位置。为此,我将com.apple.locationd.preauthorized布尔值设置为 true 添加到我的可执行权利键中。问题是何时Location Services关闭。在这种情况下,当我想获取设备位置时,会弹出 UIAlertView 告诉用户位置服务已关闭。基本上有两种方法,但我不知道它们是否可行。首先,以编程方式打开/关闭设置中的定位服务首选项。其次,使用另一个代码获取位置,而无需设置 Locations ServicesON


更新01:

我按照 iMokhles 所说的做了,我想它应该可以工作,但什么也没发生。我想这是因为权利,我看到了系统日志,这是记录的内容:

iPhone locationd[44] <Error>: Entitlement com.apple.locationd.authorizeapplications required to use _CLDaemonSetLocationServicesEnabled
iPhone myDaemon[3443] <Error>: CoreLocation: CLInternalSetLocationServicesEnabled failed

所以我将此密钥添加到权利中,但它仍然给了我这个错误。在我检查了 Preferences app entitlement 后,我​​将这些行添加到了 entitlements plist 中,但仍然没有任何反应。

<key>com.apple.locationd.authorizeapplications</key>
<true/>
<key>com.apple.locationd.defaults_access</key>
<true/>
<key>com.apple.locationd.effective_bundle</key>
<true/>
<key>com.apple.locationd.status</key>
<true/>
4

1 回答 1

1

这是 FlipSwitch位置开关的示例

在你的标题中声明它

@interface CLLocationManager
+ (id)sharedManager;
+ (BOOL)locationServicesEnabled;
+ (void)setLocationServicesEnabled:(BOOL)enabled;
@end

然后您可以使用以下代码访问它以检查是否启用

if([[[objc_getClass("CLLocationManager") sharedManager] locationServicesEnabled] {
    // Enabled
} else {
   // Disabled
}

并启用/禁用位置

[objc_getClass("CLLocationManager") setLocationServicesEnabled:YES];
[objc_getClass("CLLocationManager") setLocationServicesEnabled:NO];

并且不要忘记导入 CoreLocation Framework ;) 和

#import <objc/runtime.h>

编辑 上面的检查代码

祝你好运

于 2014-09-01T15:03:04.540 回答