更新:2020 年苹果对位置隐私政策有更新,本文代码太旧。Tips:搜索 iOS 定位有关文章时,先筛选一下时间范围,一年内。
import Foundation
import UIKit
import CoreLocation
// 用 CoreLocation的话,先在info.plist里加上:
// Privacy - Location When In Use Usage Description 可填:是否允许定位?
// 此外,本文内容需要真机调试
class ViewController: UIViewController, CLLocationManagerDelegate {
// 想要的地址:
var city:String!
//得到经纬度信息的定位管理器:
var locationManager:CLLocationManager!
//一会通过解析经纬度得位置:Geo就是Geography ,这里先编码: coder
var geocoder = CLGeocoder()
//写个定位方法:
func locate(){
if CLLocationManager.locationServicesEnabled()==false {
return //服务没开
} else{
self.locationManager = CLLocationManager()
if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion:0)) {
// 系统的版本最低 大于等于 iOS8 :
//弹窗询问是否允许定位?(下面这句) (一次询问永久授权)
self.locationManager.requestAlwaysAuthorization()
}
//开始定位
self.locationManager.startUpdatingLocation()
//有两个协议方法,先实现协议:CLLocationManagerDelegate ,再加 self 代理:
self.locationManager.delegate = self
}
}
//两个协议方法,只示范这两个:一个失败一个成功
func locationManager(_ manager:CLLocationManager, didFailWithError error:Error) {
return //失败
}
func locationManager(_ manager:CLLocationManager, didUpdateLocations locations: [CLLocation]) {
//把定位来的位置都装locations数组里
//如果取来了,数组有内容了 即 count 大于0
if locations.count>0 {
manager.stopUpdatingLocation()
//调用方法停止,不用再取位置了。不停止的话,他会在后台一直跑 耗电 快
let result = locations.last
//取出来位置 result,解析地理位置:reverseGeocode看单词可以知道是反地理编码--解码
geocoder.reverseGeocodeLocation(result!, completionHandler: {(placeMarks,error)-> Void in
if (placeMarks?.count)! > 0 {
self.city = placeMarks![0].locality!
//取数组第一个,因为加了第一个之后我们就stop了。这个locality属性就是城市名字。
//在主线程里刷新信息:
DispatchQueue.main.async {
self.initView() //这是自己定义的方法,得到city就去改视图了
}
}
})
}
}
override func viewDidLoad() {
super.viewDidLoad()
locate()
}
func initView(){
//在这里,你可以通过city位置来对view做一些更改了
}
}