前言
App中越来越多的功能依赖用户实际的位置,例如基于用户位置提供推荐数据、基于定位判断某些功能是否可用,但是在开发调试中XCode却没有提供自定义的模拟定位的功能,所以本文主要的目的是现实一个可以在开发调试过程中随时模拟定位的功能。
思路
我们在iOS的app开发中通常采用的是`CLLocationManager`来获取用户当前的位置,当然也可以采用`MKMapView`的`showUserLocation`来获取用户的位置,所以我们分别针对这两种情况分析。
CLLocationManager
采用`CLLocationManager`获取定位时,是根据`CLLocationManagerDelegate`中`- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations`的回调来获取到定位的。我们只需要在系统回调这个方法传递给业务代码的中间,插入一部分代码,来修改locations参数。原本的逻辑为`系统回调`->`业务代码`,现在变为`系统回调`->`模拟定位模块`->`业务代码`,就实现了无侵入式的实现模拟定位功能。为了实现这个逻辑,可以有以下几个思路。
1、 Runtime swizzle
因为`业务代码`是根据`- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations`方法来接受回