谷歌地图:iOS 中的自定义 LocationSource
Posted
技术标签:
【中文标题】谷歌地图:iOS 中的自定义 LocationSource【英文标题】:Google Maps: custom LocationSource in iOS 【发布时间】:2015-11-18 19:03:32 【问题描述】:我已经构建了一个 android 应用程序,它能够使用 Google 地图显示用户的地理位置以及 Wifi、Cells 和 GPS 之外的其他一些信息,例如 QR 码、信标或任何我可以用来表示当前位置的信息(我没有考虑这些位置的实际准确性)。我正在使用LocationSource
并通过setLocationSource 将其传递给Google Maps API。
我必须使用 Google 地图,因为 Apple 地图的可用缩放级别有限,因此我无法放大建筑物。
是否可以提供一个自定义的LocationManager
,它会通过某些操作定期更新,并将其注入到 Google Maps API 中,例如LocationSource
?
我知道有一些黑客可以在地图上放置自定义标记,但这使得无法使用谷歌地图的其他功能,例如通过点击“我的位置”按钮将相机移动到用户位置。
谢谢。
【问题讨论】:
CLLocationManager
与LocationSource
不同,它会在用户位置或航向发生变化时更新数据。
【参考方案1】:
有一个解决方案。 Google Maps API 使用 Cocoa 框架类 CLLocationManager。每个想要了解当前 GPS 位置更改的人都必须符合 CLLocationManagerDelegate 并成为 CLLocationManager 对象的委托。更新通过 locationManager:didUpdateLocations: 委托方法。 这是每个人都知道的理论。所以为了模拟位置数据,我们需要找到一种方法来调用这个方法,将我们自己的数据传递给它。 幸运的是,可以通过 class_addMethod 和 class_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)
对于我们的案例,我们需要更改位置管理器委托的 setter 并添加我们自己的 setter 作为扩展:
extension CLLocationManager
func override_setDelegate(delegate: CLLocationManagerDelegate)
// save a reference to self
GMLocationManager = self
override_setDelegate(delegate)
一旦我们保存了对 Google 地图位置管理器的引用,我们现在可以调用 locationManager:didUpdateLocations: 委托方法,使用额外的扩展方法模拟位置。
extension CLLocationManager
func simulateLocation(location: CLLocation)
self.delegate?.locationManager?(self, didUpdateLocations: [location])
// ...
GMLocationManager?.simulateLocation(fakeLocation)
【讨论】:
【参考方案2】:最简单的解决方案是您描述的。您禁用地图的“我的位置”标记和“我的位置”按钮,创建自定义位置标记,在地图上添加自定义“我的位置”按钮,这将转到您的自定义标记。 要禁用默认的“我的位置”元素:
mMap.setMyLocationEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(false);
【讨论】:
【参考方案3】:在我看来,目前无法将自定义位置从任意位置源注入 ios 上的 Google 地图。不幸的是,我们只能使用 pengrad 所述的自定义位置标记。但是,这意味着一些额外的缺点,例如 myLocation 按钮不起作用或使用当前位置进行导航。所以,我们在寻找的不是集成解决方案。
在 iOS 上,使用 Core Location Framework 并在其上绘制带有当前位置的自定义位图视图仍然是最好的,当搬出建筑物时,切换回通常的谷歌地图。
【讨论】:
以上是关于谷歌地图:iOS 中的自定义 LocationSource的主要内容,如果未能解决你的问题,请参考以下文章