// // MP_LocationManager.swift // MusicPlayer // // Created by Mr.Zhou on 2024/4/23. // import Foundation import CoreLocation class MP_LocationManager: NSObject { static let shared = MP_LocationManager() var getAuthHandle: ((_ success: Bool) -> Void)? //位置管理 private var locationManager: CLLocationManager! //定位信息(字符串) private var location:String = "US" override init() { super.init() locationManager = CLLocationManager() //设置了精度最差的 3公里内 kCLLocationAccuracyThreeKilometers locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers locationManager.delegate = self } /// 获取定位权限并处理新事件 /// - Parameter complete: 尾随事件 func setLocationPermission(_ viewController:UIViewController ,complete:(() -> Void)?) { if MP_LocationManager().hasLocationPermission() == true { //成功获取权限 if complete != nil { complete!() } }else { //未获取权限 switch MP_LocationManager().locationPermission() { case .notDetermined: MP_LocationManager().requestLocationAuthorizaiton() case .restricted, .denied: DispatchQueue.main.async { let alertController = UIAlertController(title: "Location permission request", message: "“Musicoo” needs to obtain your location information in order to refine the preview music information provided to you!", preferredStyle: .alert) let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) let OKAction = UIAlertAction(title: "Settings", style: .default) { (action) in let url = URL(string: UIApplication.openSettingsURLString) if let url = url,UIApplication.shared.canOpenURL(url){ if #available(iOS 10, *) { UIApplication.shared.open(url, options:[:], completionHandler: nil) }else{ UIApplication.shared.canOpenURL(url) } } } alertController.addAction(CancelAction) alertController.addAction(OKAction) viewController.present(alertController, animated: true, completion: nil) } default: if complete != nil { complete!() } } } } /// 设备是否开启了定位服务 fileprivate func hasLocationService() -> Bool { return CLLocationManager.locationServicesEnabled() } /// APP是否有定位权限 fileprivate func hasLocationPermission() -> Bool { switch locationPermission() { case .notDetermined, .restricted, .denied: return false case .authorizedWhenInUse, .authorizedAlways: return true default: break } return false } /// 定位的权限 fileprivate func locationPermission() -> CLAuthorizationStatus { if #available(iOS 14.0, *) { let status: CLAuthorizationStatus = locationManager.authorizationStatus print("location authorizationStatus is \(status.rawValue)") return status } else { let status = CLLocationManager.authorizationStatus() print("location authorizationStatus is \(status.rawValue)") return status } } //MARK: - 获取权限,在代理‘didChangeAuthorization’中拿到结果 func requestLocationAuthorizaiton() { locationManager.requestWhenInUseAuthorization() } //MARK: - 获取位置 func requestLocation() -> String { //请求地理位置 locationManager.requestLocation() return location } } extension MP_LocationManager: CLLocationManagerDelegate { //MARK: - ios 14.0 之前,获取权限结果的方法 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { handleChangedAuthorization() } //MARK: - ios 14.0,获取权限结果的方法 func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { handleChangedAuthorization() } private func handleChangedAuthorization() { if let block = getAuthHandle, locationPermission() != .notDetermined { if hasLocationPermission() { block(true) } else { block(false) } } } //MARK: - 获取定位后的位置 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let loction = locations.last { //成功获取定位 print("latitude: \(loction.coordinate.latitude) longitude:\(loction.coordinate.longitude)") let geocoder = CLGeocoder() geocoder.reverseGeocodeLocation(loction) { (placemarks, error) in if let placemark = placemarks?.first { //编码成功 if let area = placemark.administrativeArea, !area.isEmpty { print("Area code: \(area)") self.location = area } else if let locality = placemark.locality, !locality.isEmpty { print("Area code: \(locality)") self.location = locality } else if let country = placemark.country, !country.isEmpty { print("Country code: \(country)") self.location = country } } if let error = error { print("Reverse geocoding failure: \(error.localizedDescription)") //编码失败,默认设置位置是US self.location = "US" return } } } } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { print("Reverse geocoding failure: \(error.localizedDescription)") //编码失败,默认设置位置是US self.location = "US" } }