在 iOS 中获取 iPhone 位置,无需将“位置服务”设置为“开”

Posted

技术标签:

【中文标题】在 iOS 中获取 iPhone 位置,无需将“位置服务”设置为“开”【英文标题】:Get iPhone location in iOS without preference Location Services set to ON 【发布时间】:2014-10-25 19:55:37 【问题描述】:

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


更新 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/>

【问题讨论】:

【参考方案1】:

这是来自 FlipSwitch Location Switch 的示例

在标题中声明

@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>

编辑 检查上面的代码

祝你好运

【讨论】:

谢谢。 setLocationServicesEnabled 工作正常,但我无法从 locationServicesEnabled 获取当前值。它总是返回真值。我有个问题。 locationServicesEnabled 是一个类方法,那你为什么用sharedManager 来调用它呢? 顺便说一句,为什么使用 [objc_getClass("CLLocationManager") setLocationServicesEnabled:] 而不是 [CLLocationManager setLocationServicesEnabled:] 工作? (我的意思是日志说我的问题是使用objc_getClass 时的权利,我根本不需要权利!)。不过我有一个猜测。我认为这是因为当您从它的名称中获取类时,它是从从 dyld_shared_chache 加载的 CLLocation 框架的二进制文件中执行的,并且因为该二进制文件具有正确的权限,所以不需要权利。我说的对吗? [CLLocationManager locationServicesEnabled] 有效!我不知道为什么它在几分钟前不起作用。也许我的测试错了:)我已经稍微修改了你的答案。

以上是关于在 iOS 中获取 iPhone 位置,无需将“位置服务”设置为“开”的主要内容,如果未能解决你的问题,请参考以下文章

ios弹出询问位置权限显示不停,直到我打开我的iPhone

[GPIO]推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置

如何从装有 iOS 5(供个人使用)的新 iPhone 获取历史位置数据?

推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置

推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置

如何在iphone的后台获取位置[关闭]