import UIKit
@objc public protocol ADLocationProtocol {
//得到经纬度
@objc optional func locationManager(latitude: Double, longitude: Double)
//获取城市信息
@objc optional func locationCityInfo(cityName: String)
/// 定位城市失败
@objc optional func locationCityFail()
}
class ADLocation: NSObject {
public weak var delegate: ADLocationProtocol?
public static let shared = ADLocation.init()
private var locationManager: CLLocationManager?
public func didUpdateLocation(_ vc: UIViewController){
self.delegate = vc as? ADLocationProtocol
self.requestLocationService()
}
//初始化定位
private func requestLocationService(){
if self.locationManager == nil {
self.locationManager = CLLocationManager()
self.locationManager?.delegate = self
}
self.locationManager?.requestWhenInUseAuthorization()
// self.locationManager?.startUpdatingLocation()
if CLLocationManager.authorizationStatus() == .denied {
//定位服务未开启
self.alert()
}else if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.notDetermined {
//未知错误
locationManager?.requestWhenInUseAuthorization()
}else if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways {
locationManager?.desiredAccuracy = kCLLocationAccuracyBest
let distance: CLLocationDistance = 100
locationManager?.distanceFilter = distance
locationManager?.startUpdatingLocation()
}
}
//获取定位代理返回状态进行处理
private func reportLocationServicesAuthorizationStatus(status: CLAuthorizationStatus) {
if status == .notDetermined {
//未知,继续请求授权
requestLocationService()
}else if(status == .restricted || status == .denied){
//受限制,提示授权
self.alert()
guard let delegate = self.delegate else { return }
delegate.locationCityFail?()
}else {
//重新请求
requestLocationService()
}
}
private func alert(){
ADAlert.alertTitle(title: "定位权限未开启", content: "请在设置中开启appName定位权限", textAlignment: .center, leftTitle: "暂不", rightTitle: "去设置") { (result) in
if result {
let url = NSURL.init(string: UIApplication.openSettingsURLString)!
if UIApplication.shared.canOpenURL(url as URL) {
UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
}
}
}
}
}
extension ADLocation: CLLocationManagerDelegate{
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
//停止定位
self.locationManager?.stopUpdatingLocation()
let location = locations.last ?? CLLocation.init()
let coordinate = location.coordinate
let latitude: Double = coordinate.latitude
let longitude: Double = coordinate.longitude
delegate?.locationManager?(latitude: latitude, longitude: longitude)
let geocoder = CLGeocoder.init()
geocoder.reverseGeocodeLocation(location) { (placemarkList, error) in
guard let placemarkList = placemarkList else { return }
if placemarkList.count > 0 {
guard let placemark = placemarkList.first else { return }
var city = placemark.locality
if city == nil {
city = placemark.administrativeArea
}
debugPrint("city \(city)")
guard let delegate = self.delegate else { return }
delegate.locationCityInfo?(cityName: city ?? "")
}
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
debugPrint("权限改变")
reportLocationServicesAuthorizationStatus(status: status)
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
debugPrint("定位失败")
guard let delegate = self.delegate else { return }
delegate.locationCityFail?()
self.locationManager?.stopUpdatingLocation()
}
}
地图定位
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本文主要介绍手机定位方式、百度地图SDK[https://lbsyun.baidu.com/index.php?t...
- 转载、引用请标明出处http://www.jianshu.com/p/29ccac3e1e42本文出自zhh_ha...