全部产品

接入 iOS

更新时间:2020-09-14 14:39:00

定位 SDK 是一套简单的 LBS (Location-based services) 定位接口,您可以使用这套定位 API 获取定位结果。

前置条件

您已经接入工程到 mPaaS。更多信息,请参见以下内容:

添加 SDK

  1. 根据您采用的接入方式,请选择相应的添加方式。
    • 使用 mPaaS Xcode Extension。
      此方式适用于采用了 基于 mPaaS 框架接入基于已有工程且使用 mPaaS 插件接入 的接入方式。
      1. 点击 Xcode 菜单项 Editor > mPaaS > 编辑工程,打开编辑工程页面。
      2. 选择 移动定位,保存后点击 开始编辑,即可完成添加。
    • 使用 cocoapods-mPaaS 插件。此方式适用于采用了 基于已有工程且使用 CocoaPods 接入 的接入方式。
      1. 在 Podfile 文件中,使用 mPaaS_pod "mPaaS_LBS" 添加移动定位组件依赖。
      2. 执行 pod install 即可完成接入。
  2. 打开定位提醒。
    111

使用 SDK

本文将结合 定位 官方 Demo 介绍如何在 10.1.32 及以上版本的基线中使用 定位 SDK。

目前,在 APMobileLBS 模块中,提供了获取当前位置的经纬度信息方法。

说明:定位服务目前暂不支持逆地理查询功能,您可调用高德接口进行逆地理查询。

API 说明

参见以下代码,了解定位服务相关接口,通过注释获取接口和相关参数说明。

使用 MPLBSConfiguration 配置参数

  1. /**
  2. 定位服务的配置
  3. */
  4. @interface MPLBSConfiguration : NSObject
  5. /** 单次定位期望精度,单位米,建议结合业务场景传入一个可接受正数,如500,即500m以内的范围 */
  6. @property (nonatomic, assign) CLLocationAccuracy desiredAccuracy;
  7. /** 单次定位接受的缓存时间,从当前时间往前推,多长时间内的缓存是有效的,推荐设置30s以上的缓存时间 */
  8. @property (nonatomic, assign) APCoreLocationCacheAvaliable cacheTimeInterval;
  9. /** 单次定位或逆地理查询的超时时间,单位秒,默认和最小设置为2s */
  10. @property (nonatomic, assign) NSTimeInterval timeOut;
  11. /** 逆地理查询的信息级别,默认APCoreLocationReGeoLevelDistrict */
  12. @property (nonatomic, assign) LBSLocationReGeoLevel reGeoLevel;
  13. /** 逆地理查询的位置信息,在其中指定经纬度坐标 */
  14. @property (nonatomic, strong) CLLocation *reGeoLocation;
  15. /** 逆地理查询位置信息是否为高德坐标系,默认YES(使用 reGeoLocation 参数时生效) */
  16. @property (nonatomic, assign) BOOL reGeoCoordinateConverted;
  17. /** 是否打开签到功能,默认NO(按需设置打开) */
  18. @property (nonatomic, assign) BOOL needCheckIn;
  19. /**
  20. * 是否需要高精度定位,iOS 14 以下不区分精度,iOS 14 及以上默认 NO (低精度),需要业务指定是否需要高精度定位。
  21. */
  22. @property (nonatomic,assign) BOOL highAccuracyRequired;
  23. @end

使用 MPLBSLocationManager 发起定位请求

  1. /**
  2. 定位结果的回调 block
  3. @param success 是否成功
  4. @param locationInfo 位置信息
  5. @param error 定位失败的错误信息
  6. */
  7. typedef void(^MPLBSLocationCompletionBlock)(BOOL success,
  8. MPLBSLocationInfo *locationInfo,
  9. NSError *error);
  10. /**
  11. 定位服务
  12. */
  13. @interface MPLBSLocationManager : NSObject
  14. /**
  15. 初始化
  16. @param configuration 参数配置
  17. @return 实例
  18. */
  19. - (instancetype)initWithConfiguration:(MPLBSConfiguration *)configuration;
  20. /**
  21. 发起单次定位
  22. @param needReGeocode 是否需要逆地理信息。由于定位服务目前暂不支持逆地理查询功能,此处需传入 NO。
  23. @param block 定位结束的回调block
  24. */
  25. - (void)requestLocationNeedReGeocode:(BOOL)needReGeocode
  26. completionHandler:(MPLBSLocationCompletionBlock)block;

其中回调中 MPLBSLocationInfo 的说明

  1. /**
  2. 逆地理信息
  3. */
  4. @interface MPLBSReGeocodeInfo : NSObject
  5. @property (nonatomic, strong) NSString* country; // 国家
  6. @property (nonatomic, strong) NSString* countryCode; // 国家编码
  7. @property (nonatomic, strong) NSString* provience; // 省
  8. @property (nonatomic, strong) NSString* city; // 城市
  9. @property (nonatomic, strong) NSString* district; // 区
  10. @property (nonatomic, strong) NSString* street; // 街道
  11. @property (nonatomic, strong) NSString* streetCode; // 街道编码
  12. @property (nonatomic, strong) NSString* cityCode; // 城市编码
  13. @property (nonatomic, strong) NSString* adCode; // 行政区划编码
  14. @property (nonatomic, strong) NSArray* poiList; // poi 信息列表
  15. @end
  16. /**
  17. 定位结果的位置信息数据结构
  18. */
  19. @interface MPLBSLocationInfo : NSObject
  20. @property (nonatomic, strong) CLLocation* location; // 位置信息
  21. @property (nonatomic, strong) MPLBSReGeocodeInfo* rgcInfo; // 逆地理信息
  22. @end

代码示例

  1. - (void)getLocation {
  2. MPLBSConfiguration *configuration = [[MPLBSConfiguration alloc] init];
  3. configuration.desiredAccuracy = kCLLocationAccuracyBest;
  4. self.locationManager = [[MPLBSLocationManager alloc] initWithConfiguration:configuration];
  5. [self.locationManager requestLocationNeedReGeocode:NO completionHandler:^(BOOL success, MPLBSLocationInfo * _Nonnull locationInfo, NSError * _Nonnull error) {
  6. NSString *message;
  7. if (success) {
  8. message = [NSString stringWithFormat:@"定位成功, 经度: %.5f, 维度: %.5f, 精确度: %.3f, 是否高精度 : %d", locationInfo.location.coordinate.longitude, locationInfo.location.coordinate.latitude, locationInfo.location.horizontalAccuracy, !locationInfo.location.ap_lbs_is_high_accuracy_close];
  9. } else {
  10. message = [NSString stringWithFormat:@"%@", error];
  11. }
  12. dispatch_async(dispatch_get_main_queue(), ^{
  13. AUNoticeDialog *alert = [[AUNoticeDialog alloc] initWithTitle:@"定位结果" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  14. [alert show];
  15. });
  16. }];
  17. }

iOS 14 适配

在 iOS 14 中,精确位置作为一个权限选项,在申请定位权限时供用户主动选择,并且在定位权限设置页面可供用户调整,如下图所示。

入参适配

在 MPLBSConfiguration 中,增加了 highAccuracyRequired 设置,如果入参 highAccuracyRequired = YES,用户关闭高精度定位权限,则回调错误。

  1. /**
  2. 定位服务的配置
  3. */
  4. @interface MPLBSConfiguration : NSObject
  5. /**
  6. * 是否需要高精度定位,iOS14以下不区分精度,iOS14及以上默认NO(低精度),需要业务指定是否需要高精度定位。
  7. */
  8. @property (nonatomic,assign) BOOL highAccuracyRequired;
  9. @end
  1. //如果入参highAccuracyRequired = YES,且无高精度定位权限则回调错误
  2. ErrorcodeAPCoreLocationErrorCodeHighAccuracyAuthorization

回调适配

如果入参 highAccuracyRequired = NO 或者 未设置,则回调的 CLLocation 对象里面会增加字段ap_lbs_is_high_accuracy_close 以标识是否关闭高精度定位。

  1. // 出参改造
  2. @interface CLLocation (APMobileLBS)
  3. /*
  4. * 是否关闭精准定位,默认为NO
  5. */
  6. @property(nonatomic,assign)BOOL ap_lbs_is_high_accuracy_close;
  7. @end

代码示例

  1. - (void)getLocationWithHighAccuracy {
  2. MPLBSConfiguration *configuration = [[MPLBSConfiguration alloc] init];
  3. configuration.desiredAccuracy = kCLLocationAccuracyBest;
  4. configuration.highAccuracyRequired = YES;
  5. self.locationManager = [[MPLBSLocationManager alloc] initWithConfiguration:configuration];
  6. [self.locationManager requestLocationNeedReGeocode:NO completionHandler:^(BOOL success, MPLBSLocationInfo * _Nonnull locationInfo, NSError * _Nonnull error) {
  7. NSString *message;
  8. if (success) {
  9. message = [NSString stringWithFormat:@"定位成功, 经度: %.5f, 维度: %.5f, 精确度: %.3f, 是否高精度 : %d", locationInfo.location.coordinate.longitude, locationInfo.location.coordinate.latitude, locationInfo.location.horizontalAccuracy, !locationInfo.location.ap_lbs_is_high_accuracy_close];
  10. } else {
  11. message = [NSString stringWithFormat:@"%@", error];
  12. }
  13. dispatch_async(dispatch_get_main_queue(), ^{
  14. AUNoticeDialog *alert = [[AUNoticeDialog alloc] initWithTitle:@"定位结果" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  15. [alert show];
  16. });
  17. }];
  18. }