是否可以直接从 appDelegate 获取 GPS 位置 ios8

Posted

技术标签:

【中文标题】是否可以直接从 appDelegate 获取 GPS 位置 ios8【英文标题】:Is it possible to fetch GPS location ios8 directly from appDelegate 【发布时间】:2015-09-30 10:34:23 【问题描述】:

我正在开发 ios8+ 中的应用程序,我必须在其中获取用户的位置。当我在屏幕(视图控制器)中使用 CLLocationManager 时,我能够获取位置。但是当我尝试直接从 AppDelegate 获取位置时,似乎出现了一些问题,我没有得到任何位置(流程没有进入委托方法)。 有人可以帮我解决这个问题吗?

这是我使用的代码:

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
    [locationManager requestWhenInUseAuthorization];

if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) 
    [locationManager requestAlwaysAuthorization];

[locationManager startUpdatingLocation];

你能帮我解决这个问题吗?谢谢

【问题讨论】:

【参考方案1】:
    CLLocationManagerDelegate添加到AppDelegate.h

@interface AppDelegate : NSObject < UIApplicationDelegate, CLLocationManagerDelegate>

    CLLocationManager 对象作为属性添加到AppDelegate.m

您必须将CLLocationManager 对象作为属性来实现。

@interface AppDelegate () @property (nonatomic, strong) CLLocationManager *locationManager; @end

    将 AppDelegate.m 中的 locationManager 替换为 self.locationManager

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) [self.locationManager requestWhenInUseAuthorization]; if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) [self.locationManager requestAlwaysAuthorization]; [self.locationManager startUpdatingLocation];

参考。 https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/

在涉及该对象的所有任务完成之前,需要保持对位置管理器对象的强引用。由于大多数位置管理器任务都是异步运行的,因此将位置管理器存储在局部变量中是不够的。

【讨论】:

酷!有效!不过我很困惑..为什么它不早点工作?添加属性有什么不同? @auditya 您必须保留 CLLocationManager 实例。我编辑了我的答案。【参考方案2】:

还知道 CoreLocation 权限已随 iOS 8 更改。如果您不请求新的权限授权,CoreLocation 不会做任何事情。它悄悄地失败了,因为从未调用过委托方法。

Try this link

虽然这篇文章非常详细且冗长,但实际的代码修复可能与此一样小:

if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
[locationManager requestWhenInUseAuthorization];

您必须向 info.plist 添加一个值,这是要在权限警报中显示的消息。请参阅屏幕抓取。

键:NSLocationWhenInUseUsageDescription

值:需要位置才能找出您所在的位置(您可以将其更改为任何您想要的)

【讨论】:

我已经将密钥添加到 plist 中,当我通过视图控制器访问它时,我能够获取该位置。但是当我尝试直接从 appdelegate 获取位置时,我无法获取它(这样我可以在打开应用程序时直接获取位置,而不是在打开视图控制器时)你能帮我了解如何直接获取位置吗来自 appdelegate ***.com/questions/15913239/…

以上是关于是否可以直接从 appDelegate 获取 GPS 位置 ios8的主要内容,如果未能解决你的问题,请参考以下文章

arcgis之gp服务发布

appDelegate 实践

高斯过程(GP)

从 appDelegate 检索核心数据模型版本

使用 gp_segment_id 作为分区列从 greenplum 中并行获取数据

从 AppDelegate 中的 ViewController 获取参数。