本文旨在为大家提供“干货”,在文章结尾会提供Demo下载地址。本文内容简单,但实用价值高,有需要的自取,并关注我!大牛可绕行。后续Richy将定期为大家更新...
闲话不多说了,先给大家看效果展示:
本文主要包含内容:
1. CLLocationManager定位功能(重点阐释);
2. CLGeocoder逆地理编码;
3. 城市列表选择功能实现;
CityLocation例子中,大家只需关注以下3个文件的实现就可以了:
一、CLLocationManager定位功能实现
1.1 主要代码实现:
1.1.1 创建位置管理器LocationManager
1.1.2 开启定位
1.1.3 定位成功回调
1.1.4 定位失败回调
1.1.5 UIBackgroundModes开启 Location Updates(容易遗漏)
1.1.6 Info.plist 增加定位描述(容易忽视)
需在info.plist添加NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription字段
NSLocationWhenInUseUsageDescription表示应用在前台的时候可以搜到更新的位置信息。
NSLocationAlwaysUsageDescription表示应用在前台和后台都可以获取到更新的位置数据,具体配置见下图:
1.2 常常出现的问题,或你忽视的细节
回忆自己刚开发的时候,抑或是目前大家在各大论坛上提出的定位问题,无外乎:1.定位结果的回调方法不执行;2.定位服务是否开启的Alert不显示;3.CLLocationManager怎么实现定位(这个就不说了,直接看Demo内容)。
在遇到上述问题之后,您先核实上文(1.1.5和1.1.6)Info.plist和BackgroundModes有没有设置???
1.2.1 在确定无误后,咱们先看第1个问题-定位回调方法不执行?
可能原因1:LocationManager所创建的实例,写成了局部变量,这样会导致其在定位之前就可能被销毁掉了。故大家要将其声明为成员变量形式,以延长生命周期,具体可参考Demo写法;
可能原因2: 定位服务“假开启”(简单阐释:虽然经过了系统locationServicesEnabled的验证,也调用了-startUpdatingLocation,但最终仍无法定位),这个时候,大家需要在[手机设备-设置-定位服务]中找到该App,确认其开启状态。
其他原因:就需要大家注意代码习惯了,譬如代理(delegate)没有设置,这个就不解释了。如果大家还遇到了一些奇葩状况,不妨给我留言,咱们共同研究。
1.2.2 咱们再看下第2个问题-是否开启定位的Alert不显示?
首先确认,在Info.plist中你所增加的定位描述是仅前台定位(NSLocationWhenInUseUsageDescription)还是持续定位(NSLocationAlwaysUsageDescription)?然后,由于iOS8.0之后,定位需要手动授权。最后,常常出现此状况的原因就是你Info.plist中的描述和请求授权(requestWhenInUseAuthorization/requestAlwaysAuthorization)调用的方法不一致导致的。
Apple官方说明中也有此类似的描述:
1.2.3 多次定位的处理
Demo中给大家提供了一个简单的处理,通过一个BOOL值成员变量(_isLocationed),记录当前定位的状态。
if(!_isLocationed){
// 对定位到的经纬度处理
_isLocationed = YES;
};
二、CLGeocoder逆地理编码
说明:所谓的逆地理编码,即通过经纬度坐标得到真实地址的过程;而它的逆过程,称之为地理编码。具体代码的涵义就不多说了,有详细的说明信息。再多说一点,经过逆地理编码得到的信息很多,例子中Richy仅对城市(city)进行了使用,如果你想了解的详细结果,不妨在Demo中,详细查看CLPlacemark的内容。
三、城市列表选择功能
该功能不难理解,重点依然是Richy为大家提供的城市列表的数据cityGroup.plist(需要的自取),其他就是UITableView结合数据源的使用,还有通过Blocks进行数据传值的使用。
四、最后,感谢大家坚持看完本文。您的鼓励和支持是Richy的动力源泉。大家也可扫描下边的二维码,关注Richy的微信公众号,了解Richy的动态。
简书地址:http://www.jianshu.com/users/76e87d7d8887/latest_articles
GitHub:https://github.com/RichyLeo
网友评论