gpt4 book ai didi

android - 谷歌地图 : custom LocationSource in iOS

转载 作者:可可西里 更新时间:2023-11-01 03:17:11 24 4
gpt4 key购买 nike

我已经构建了一个 Android 应用程序,它能够使用 Google map 显示用户的地理位置,以及除 Wifi、手机和 GPS 之外的一些附加信息,例如 QR 码、信标或任何我可以用来表示当前位置的信息 (我没有考虑这些位置的实际准确性)。我正在使用 LocationSource 并通过 setLocationSource 将其传递给 Google Maps API .

我必须使用 Google map ,因为 Apple map 的可用缩放级别有限,所以我无法放大建筑物。

是否可以提供一个自定义的 LocationManager,它会通过某些操作定期更新并将其注入(inject) Google Maps API,如 LocationSource

我知道有一些黑客可以在 map 上放置自定义标记,但是这使得无法使用 Google map 的其他功能,例如通过点击“我的位置”按钮将相机移动到用户位置。

谢谢。

最佳答案

有一个解决方案。 Google Maps API 使用 Cocoa 框架类 CLLocationManager。每个想要了解当前 GPS 位置变化的人都必须符合 CLLocationManagerDelegate 并且是 CLLocationManager 对象的委托(delegate)。更新通过locationManager:didUpdateLocations: 委托(delegate)方法。这是一个人人都知道的理论。因此,为了模拟位置数据,我们需要找到一种方法来调用此方法,将我们自己的数据传递给它。幸运的是,有机会通过函数 class_addMethodclass_replaceMethod 动态改变任何类的行为。所以现在我们可以用方法 override_abc 改变方法 abc 的实现,它可以在类中实现,如下所示:

let originalSelector = NSSelectorFromString("setDelegate:")
let newSelector = NSSelectorFromString("override_setDelegate:")

let originalMethod = class_getInstanceMethod(CLLocationManager.self, originalSelector)
let newMethod = class_getInstanceMethod(CLLocationManager.self, newSelector)

method_exchangeImplementations(originalMethod, newMethod)

对于我们的案例,我们需要更改位置管理器委托(delegate)的 setter 并添加我们自己的 setter 作为扩展:

extension CLLocationManager {
func override_setDelegate(delegate: CLLocationManagerDelegate) {
// save a reference to self
GMLocationManager = self
override_setDelegate(delegate)
}
}

保存对 Google map 位置管理器的引用后,我们现在可以调用 locationManager:didUpdateLocations: 使用附加扩展方法 simulateLocation 的委托(delegate)方法。

extension CLLocationManager {
func simulateLocation(location: CLLocation) {
self.delegate?.locationManager?(self, didUpdateLocations: [location])
}
}
// ...

GMLocationManager?.simulateLocation(fakeLocation)

关于android - 谷歌地图 : custom LocationSource in iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32197844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com