1 |
在移动互联网时代,移动app能解决用户的很多生活琐事,比如 |
2 |
导航:去任意陌生的地方 |
3 |
周边:找餐馆、找酒店、找银行、找电影院 |
4 |
|
5 |
在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发 |
6 |
Map Kit :用于地图展示 |
7 |
Core Location :用于地理定位 |
8 |
|
9 |
2个热门专业术语 |
10 |
LBS :Location Based Service |
11 |
SoLoMo :Social Local Mobile(索罗门) |
12 |
|
13 |
CoreLocation框架使用前提 |
14 |
导入框架 |
15 |
|
16 |
导入主头文件 |
17 |
#import <CoreLocation/CoreLocation.h> |
18 |
|
19 |
CoreLocation框架使用须知 |
20 |
CoreLocation框架中所有数据类型的前缀都是CL |
21 |
CoreLocation中使用CLLocationManager对象来做用户定位 |
22 |
|
23 |
CLLocationManager |
24 |
|
25 |
CLLocationManager的常用操作 |
26 |
开始用户定位 |
27 |
– (void)startUpdatingLocation; |
28 |
|
29 |
停止用户定位 |
30 |
– (void) stopUpdatingLocation; |
31 |
|
32 |
当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法 |
33 |
– (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations; |
34 |
locations参数里面装着CLLocation对象 |
35 |
|
36 |
|
37 |
CLLocation |
38 |
|
39 |
CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等 |
40 |
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate; |
41 |
经纬度 |
42 |
|
43 |
@property(readonly, nonatomic) CLLocationDistance altitude; |
44 |
海拔 |
45 |
|
46 |
@property(readonly, nonatomic) CLLocationDirection course; |
47 |
路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向) |
48 |
|
49 |
@property(readonly, nonatomic) CLLocationSpeed speed; |
50 |
行走速度(单位是m/s) |
51 |
|
52 |
用- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location方法可以计算2个位置之间的距离 |
53 |
|
54 |
|
55 |
CLLocationManager |
56 |
|
57 |
@property(assign, nonatomic) CLLocationDistance distanceFilter; |
58 |
每隔多少米定位一次 |
59 |
|
60 |
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy; |
61 |
定位精确度(越精确就越耗电) |
62 |
|
63 |
CLLocationCoordinate2D |
64 |
|
65 |
CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下 |
66 |
typedef struct { |
67 |
CLLocationDegrees latitude; // 纬度 |
68 |
CLLocationDegrees longitude; // 经度 |
69 |
} CLLocationCoordinate2D; |
70 |
|
71 |
一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D |
72 |
|
73 |
|
74 |
用户隐私的保护 |
75 |
|
76 |
从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权 |
77 |
要想获得用户的位置 |
78 |
想访问用户的通讯录、日历、相机、相册等等 |
79 |
|
80 |
当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权 |
81 |
|
82 |
从iOS 8开始,用户定位分两种情况 |
83 |
总是使用用户位置:NSLocationAlwaysUsageDescription |
84 |
使用应用时定位:NSLocationWhenInUseDescription |
85 |
|
86 |
当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权 |
87 |
|
88 |
|
89 |
CLGeocoder |
90 |
|
91 |
使用CLGeocoder可以完成“地理编码”和“反地理编码” |
92 |
地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等) |
93 |
反地理编码:根据给定的经纬度,获得具体的位置信息 |
94 |
|
95 |
地理编码方法 |
96 |
– (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler; |
97 |
|
98 |
反地理编码方法 |
99 |
– (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler; |
100 |
|
101 |
|
102 |
CLGeocodeCompletionHandler |
103 |
|
104 |
当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler |
105 |
typedef void (^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error); |
106 |
这个block传递2个参数 |
107 |
error :当编码出错时(比如编码不出具体的信息)有值 |
108 |
placemarks :里面装着CLPlacemark对象 |
109 |
|
110 |
CLPlacemark |
111 |
|
112 |
CLPlacemark的字面意思是地标,封装详细的地址位置信息 |
113 |
@property (nonatomic, readonly) CLLocation *location; |
114 |
地理位置 |
115 |
|
116 |
@property (nonatomic, readonly) CLRegion *region; |
117 |
区域 |
118 |
|
119 |
@property (nonatomic, readonly) NSDictionary *addressDictionary; |
120 |
详细的地址信息 |
121 |
|
122 |
@property (nonatomic, readonly) NSString *name; |
123 |
地址名称 |
124 |
|
125 |
@property (nonatomic, readonly) NSString *locality; |
126 |
城市 |