您的位置:首页 > 移动开发 > Swift

[iOS]Swift调用百度地图之概述

2017-10-20 14:23 435 查看
最近刚学Swift,总想着搞个大事件,可是实力不行,大事件还是不要搞了。利用百度地图简单写个小Demo吧。这样还能巩固Swift语法上的一些概念。百度SDK的下载,注册这里就不做介绍了。这里只写出自己如何思考以及如何利用百度地图SDK提供的API来实现自己的功能。

概述

利用地图SDK提供的定位服务,实现自己的功能。

总结

概述

其实,市场上有几款很成熟的地图SDK供我们选择,对于大部分人来说,这些成熟的地图SDK提供的功能,都能满足我们的需求,问题在于,有时候很纠结啊!到底选择那个地图好呢?与其纠结那个地图好,倒不如想想,自己的APP需求是什么。这样自己封装出一些类供APP调用,而支撑这些类的功能代码,可以随意选择一个SDK。这样后期如果想更换SDK,其实很简单的事情,只需要在自己封装的类里改动就行了。调用封装类的代码无须改动。

利用地图SDK提供的定位服务,实现自己的功能

第一个类,获取坐标地址。需实现两个类,功能类和模型类。

功能类,提供坐标。

模型类,封装坐标信息、以及坐标所在的地址。之所以不用第三方提供的类型,是因为第三方不可能遵循一个标准。自己封装一个数据模型类。

//这里采用Objective-C实现功能类。
#import <Foundation/Foundation.h>
#import <BaiduMapAPI_Location/BMKLocationComponent.h>

/**
* 设置locationAttributes属性,具体含义可参考CLLocationManager相关属性的注释。
*/
typedef NSString* AGLocationAttributedStringKey;
UIKIT_EXTERN AGLocationAttributedStringKey const AGDistanceFilterAttributeName;                         //CLLocationDistance
UIKIT_EXTERN AGLocationAttributedStringKey const AGDesiredAccuracyAttributeName;                        //CLLocationAccuracy
UIKIT_EXTERN AGLocationAttributedStringKey const AGHeadingFilterAttributeName;                          //CLLocationDegrees
UIKIT_EXTERN AGLocationAttributedStringKey const AGPausesLocationUpdatesAutomaticallyAttributeName;     //BOOL
UIKIT_EXTERN AGLocationAttributedStringKey const AGAllowsBackgroundLocationUpdatesAttributeName;        //BOOL

@class AGUserLocation;

typedef void(^UserLocation)(AGUserLocation *userLocation);

@interface AGLocation : NSObject

@property (nonatomic, strong) NSDictionary<AGLocationAttributedStringKey, id> *locationAttributes; //定位参数,定位根据参数,进行何时更新

@property (nonatomic, copy) UserLocation userlocation; //回调方法

- (void)startLocation; //开始定位
- (void)stopLocation; //停止定位

@end

// 数据模型类

#import <Foundation/Foundation.h>

@class CLLocation;
@interface AGUserLocation : NSObject

// 位置信息,尚未定位成功,则该值为nil
@property (nonatomic, strong) CLLocation *location;
// 定位标注点要显示的标题信息
@property (nonatomic, strong) NSString *title;
/// 其它信息
@property (nonatomic, strong) NSString *other;

@end


这里简单的给出了AGLocation、AGUserLocation的头文件,如果想看实现文件查看https://gitee.com/ag_explore/MapForSwift

简单的给出了AGLocation,项目中如果需要坐标的话,只需要创建AGLocation对象即可。AGLocation的功能可以是第三方SDK提供。也可以是iOS API提供。总之,上层调用者不关心AGLocation的实现。这应该是开发AGLocation的猿应该关心的事情。

下面给出调用方法

//这里使用的是Swift
_location = AGLocation()
_location?.locationAttributes = [AGDistanceFilterAttributeName:kCLLocationAccuracyBest]
_location?.userlocation = { (userLocation:AGUserLocation?) -> Void in

if let userLocation = userLocation {

print("定位成功")
print(userLocation.location)

} else {

print("定位失败")
}

}

_location?.start() //开启定位


总结

使用AGLocation不关心AGLocation是这么实现的,它只需要关心AGLocation提供的功能是否满足。而AGLocation的实现,则需要实现AGLocation的程序员关心。这样做的好处是,我后期可以替换任何SDK。

这篇只是定位服务,下篇封装地图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: