是否有任何方法可以在我的应用程序中不使用 CLLocationManager 委托来获取当前位置

Posted

技术标签:

【中文标题】是否有任何方法可以在我的应用程序中不使用 CLLocationManager 委托来获取当前位置【英文标题】:Is There any way to get current location without using the CLLocationManager delegates in my application 【发布时间】:2013-10-20 14:12:47 【问题描述】:

我想在我的库中提供一种返回当前位置的方法。但我不能这样做,因为位置会更新并进入 CLLocationManager 委托方法。所以有什么方法可以返回用户的位置在我的库中调用一个方法之后。

提前致谢。

【问题讨论】:

【参考方案1】:

您可以将block 参数添加到您的库方法中,该方法将在收到位置更新时调用。然后可以将该块保存在一个属性中(如果多个对象可能同时等待,则可以保存到一个数组中)。

附言你真的应该使用CLLocationManager。任何其他确定位置的方法都将不太准确/同样(如果不是更多)耗时。


你可以定义一个像这样的块(取决于你想通过多少个位置):

typedef void(^LocationUpdateBlock)(CLLocation *location);

然后你添加一个公共接口供感兴趣的类注册(简单版):

property (copy, nonatomic) LocationUpdateBlock locationUpdateBlock;

然后在你的委托方法中:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

    if (self.locationUpdateBlock != nil) 
        self.locationUpdateBlock([locations lastObject]);
    

【讨论】:

+1 另外,绕过CLLocationManager 将绕过内置的位置收集权限过程,并且根据App Store Review Guidelines 的§4.1,“在收集之前未通知并获得用户同意的应用程序,传输或使用位置数据将被拒绝。”就像你说的那样,使用CLLocationManager 并提供一个使用异步调用的完成块的 API 是可行的方法。 @Rob 即使库使用CLLocationManager,用户仍将获得权限对话框。这完全没问题,违反了任何准则。如果真的有可能,那将是一个非常大的隐私漏洞。 @St3fan 抱歉,我不清楚。这正是我的观点,你想使用CLLocationManager,这样你就会得到确认。我只是想提供另一个原因,为什么 Wain 建议使用 CLLocationManager 而不是试图绕过它是个好主意。 @Wain 抱歉,我没有得到您的解决方案,您能否详细解释一下,该块将如何通过一些示例代码出现在此处。

以上是关于是否有任何方法可以在我的应用程序中不使用 CLLocationManager 委托来获取当前位置的主要内容,如果未能解决你的问题,请参考以下文章

getView() 在我的自定义列表视图中不起作用

System.out.print() 在测试方法中不显示任何内容

为啥“发布”方法在我的 django 应用程序中不起作用?

TaskDialog 在我的 Delphi 程序中不起作用

是否可以“卸载”(“不需要”)Ruby库?

MKMapview 在模拟器的 iOS-7.0 中不显示地图