123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- //
- // BaiduMapManager.swift
- // RainbowPlanet
- //
- // Created by 南鑫林 on 2018/10/17.
- // Copyright © 2018 南鑫林. All rights reserved.
- //
- import UIKit
- import SwiftyJSON
- //MARK: - 百度地图
- let kBaiduMapAppKey = "v7wFjrAQdlaBVC50CjwuRESC3Lu0xkhj"
- public class BaiduMapManager: NSObject {
-
- static let shared : BaiduMapManager = BaiduMapManager()
-
- private override init() {} // 私有化init方法
- var locationModel = LocationModel.shared()
- typealias LocationSuccessBlock = () -> Void
- var locationSuccessBlock : LocationSuccessBlock?
- typealias LocationFalseBlock = () -> Void
- var locationFalseBlock : LocationFalseBlock?
-
- /// 初始化百度
- public func initBaiduMap() -> Void {
- BMKLocationAuth.sharedInstance()?.checkPermision(withKey: kBaiduMapAppKey, authDelegate: self)
- BMKMapManager().start(kBaiduMapAppKey, generalDelegate: self)
- }
-
- // ====================================定位========================================
- /// 定位管理
- private lazy var locationManager: BMKLocationManager = {
- let locationManager = BMKLocationManager.init()
- //设置delegate
- locationManager.delegate = self
- //设置返回位置的坐标系类型
- locationManager.coordinateType = BMKLocationCoordinateType.BMK09LL
- //设置距离过滤参数
- locationManager.distanceFilter = kCLDistanceFilterNone
- //设置预期精度参数
- locationManager.desiredAccuracy = kCLLocationAccuracyBest
- //设置应用位置类型
- locationManager.activityType = CLActivityType.automotiveNavigation
- //设置是否自动停止位置更新
- locationManager.pausesLocationUpdatesAutomatically = false
- //设置是否允许后台定位
- locationManager.allowsBackgroundLocationUpdates = true
- //设置位置获取超时时间
- locationManager.locationTimeout = 10
- //设置获取地址信息超时时间
- locationManager.reGeocodeTimeout = 10
- return locationManager
- }()
- /// 开始定位
- func startLocation() {
- initLocation(locationSuccessBlock: {
- if let locationSuccessBlock = self.locationSuccessBlock {
- locationSuccessBlock()
- }
- }, locationFalseBlock: {
- if let locationFalseBlock = self.locationFalseBlock {
- locationFalseBlock()
- }
- })
- }
- /// 单次定位
- func initLocation(locationSuccessBlock:@escaping LocationSuccessBlock,locationFalseBlock:@escaping LocationFalseBlock) -> Void {
-
- locationManager.requestLocation(withReGeocode: true, withNetworkState: true) { [weak self] location, state, error in
- if (error != nil) {
- locationFalseBlock()
- return
- } else {
- if let location = location {
- if let location = location.location {
- self?.locationModel.latitude = String(describing: location.coordinate.latitude)
- self?.locationModel.longitude = String(describing: location.coordinate.longitude)
- }
- if let rgcData = location.rgcData {
- self?.locationModel.cityCode = rgcData.cityCode ?? ""
- self?.locationModel.province = rgcData.province ?? ""
- self?.locationModel.city = rgcData.city ?? ""
- self?.locationModel.district = rgcData.district ?? ""
- self?.locationModel.street = rgcData.street ?? ""
- self?.locationModel.locationdescribe = rgcData.locationDescribe ?? ""
-
- // 存放BMKLocationPoi的Array不可直接转换为Json(暂不知具体原因),建立一个Swift对应的Model
- var poiList: Array<SwiftLocationPOIModel> = []
- let oriPoiList = rgcData.poiList ?? []
- for (_, locationPoi) in oriPoiList.enumerated() {
- let poiMdl: SwiftLocationPOIModel = SwiftLocationPOIModel()
- poiMdl.name = locationPoi.name
- poiMdl.uid = locationPoi.uid
- poiList.append(poiMdl)
- }
- self?.locationModel.poiList = poiList
- }
-
- LocationModel.shared().saveObject(locationModel: self?.locationModel ?? LocationModel())
- NXLLog(LocationModel.shared().object())
- locationSuccessBlock()
- }
- }
- }
- }
-
- /// 定位设置弹框
- func loacationAlertView() {
- AlertSheetView.alert(title: "定位服务未开启", detailTitle: "请进入系统设置「设置」「隐私」「定位服务」中打开开关,并允许彩虹星球使用定位服务", cancelTitle: "取消", sureTitle: "立即开启", cancelBlock: { (popupView, Int, string) in
- if let locationFalseBlock = self.locationFalseBlock {
- locationFalseBlock()
- }
- }, confirmBlock: { (popupView, Int, string) in
- if #available(iOS 10.0, *) {
- let url = URL(string: UIApplication.openSettingsURLString)
- if let url = url {
- if UIApplication.shared.canOpenURL(url) {
- UIApplication.shared.open(url, options: [:], completionHandler: { [weak self] success in
- self?.initLocation(locationSuccessBlock: {
- if let locationSuccessBlock = self?.locationSuccessBlock {
- locationSuccessBlock()
- }
- }, locationFalseBlock: { [weak self] in
- if let locationFalseBlock = self?.locationFalseBlock {
- locationFalseBlock()
- }
- })
- })
- }
- }
- } else {
- let url = URL(string: UIApplication.openSettingsURLString)
- if let url = url {
- if UIApplication.shared.canOpenURL(url) {
- UIApplication.shared.openURL(url)
- }
- }
- }
- })
- }
-
-
- //====================================POI检索===============================
-
-
-
- typealias SuggestionSearchSuccessBlock = (_ suggestionList:Array<BMKSuggestionInfo>) -> Void
-
- var suggestionSearchSuccessBlock : SuggestionSearchSuccessBlock?
-
-
- /// 初始化地点输入提示检索对象
- private lazy var suggestionSearcharch: BMKSuggestionSearch = {
- let suggestionSearcharch = BMKSuggestionSearch()
- suggestionSearcharch.delegate = self
- return suggestionSearcharch
- }()
-
-
- private lazy var suggestionSearchOption: BMKSuggestionSearchOption = {
- let suggestionSearchOption = BMKSuggestionSearchOption()
- suggestionSearchOption.cityLimit = true
-
- return suggestionSearchOption
- }()
-
-
- /// 地点输入提示检索(Sug检索)
- ///
- /// - Parameters:
- /// - cityname: 城市名
- /// - keyword:
- func suggestionSearchPoi(cityname:String = "西安市",keyword:String = "瓦胡同") {
- suggestionSearchOption.cityname = cityname
- suggestionSearchOption.keyword = keyword
- let flag = suggestionSearcharch.suggestionSearch(suggestionSearchOption)
- if flag {
- NXLLog("Sug检索发送成功");
- } else {
- NXLLog("Sug检索发送失败");
- }
- }
- }
- // MARK: - 定位授权
- extension BaiduMapManager: BMKLocationAuthDelegate {
- public func onCheckPermissionState(_ iError: BMKLocationAuthErrorCode) {
- if (0 == iError.rawValue) {
- NXLLog("授权成功");
- } else {
- NXLLog("授权失败 \(iError)");
- }
- }
- }
- // MARK: - 定位代理
- extension BaiduMapManager:BMKLocationManagerDelegate {
-
- /// 当定位发生错误时,会调用代理的此方法。
- public func bmkLocationManager(_ manager: BMKLocationManager, didFailWithError error: Error?) {
- NXLLog("定位错误");
- }
-
- /// 定位权限状态改变时回调函数
- public func bmkLocationManager(_ manager: BMKLocationManager, didChange status: CLAuthorizationStatus) {
- if status == .notDetermined {
- //用户尚未对此应用程序做出选择
- } else if status == .restricted {
- //此应用程序无权使用位置服务。到期
- //对于位置服务的活动限制,用户不能更改
- //此状态,可能未亲自拒绝授权
- } else if status == .denied {
- //用户已明确拒绝此应用程序的授权,或者
- //位置服务在设置中被禁用。
- startLocation()
- }else if status == .authorizedAlways {
- //用户已授予随时使用其位置的权限,
- //包括区域、访问或重大位置更改的监控。
- //该值应用于iOS、tvos和watchos。它在上有售
- //macos,但kclauthorizationstatusauthorized是同义词且首选。
- startLocation()
- }else if status == .authorizedWhenInUse {
- //只有在应用程序
- //对它们可见(如果继续在后台接收位置更新)。授权使用
- //尚未授予启动API。此值在MacOS上不可用。它应该在iOS、tvos和沃特克斯。
- startLocation()
- }
-
- }
- }
- // MARK: - 地图授权
- extension BaiduMapManager: BMKGeneralDelegate {
-
- /// 返回网络错误
- ///
- /// - Parameter iError: 错误号
- public func onGetNetworkState(_ iError: Int32) {
-
- }
-
-
- /// 返回授权验证错误
- ///
- /// - Parameter iError: 错误号 : 为0时验证通过,具体参加BMKPermissionCheckResultCode
- public func onGetPermissionState(_ iError: Int32) {
- if (0 == iError) {
- NXLLog("授权成功");
- } else {
- NXLLog("授权失败 \(iError)");
- }
- }
- }
- // MARK: - 地点输入提示检索(Sug检索)
- extension BaiduMapManager: BMKSuggestionSearchDelegate {
-
- public func onGetSuggestionResult(_ searcher: BMKSuggestionSearch!, result: BMKSuggestionSearchResult!, errorCode error: BMKSearchErrorCode) {
- switch error {
- //检索结果正常返回
- case BMK_SEARCH_NO_ERROR:
- if let suggestionSearchSuccessBlock = self.suggestionSearchSuccessBlock {
- if result.suggestionList.count > 0 {
- suggestionSearchSuccessBlock(result.suggestionList)
- }
- }
- break
- case BMK_SEARCH_AMBIGUOUS_KEYWORD:
- SwiftProgressHUD.shared().showText("检索词有岐义")
- break
- case BMK_SEARCH_AMBIGUOUS_ROURE_ADDR:
- SwiftProgressHUD.shared().showText("检索地址有岐义")
- break
- case BMK_SEARCH_NOT_SUPPORT_BUS:
- SwiftProgressHUD.shared().showText("该城市不支持公交搜索")
- break
- case BMK_SEARCH_NOT_SUPPORT_BUS_2CITY:
- SwiftProgressHUD.shared().showText("不支持跨城市公交")
- break
- case BMK_SEARCH_RESULT_NOT_FOUND:
- SwiftProgressHUD.shared().showText("没有找到检索结果")
- break
- case BMK_SEARCH_ST_EN_TOO_NEAR:
- SwiftProgressHUD.shared().showText("起终点太近")
- break
- case BMK_SEARCH_KEY_ERROR:
- SwiftProgressHUD.shared().showText("key错误")
- break
- case BMK_SEARCH_NETWOKR_ERROR:
- SwiftProgressHUD.shared().showText("网络连接错误")
- break
- case BMK_SEARCH_PERMISSION_UNFINISHED:
- SwiftProgressHUD.shared().showText("还未完成鉴权,请在鉴权通过后重试")
- break
- case BMK_SEARCH_INDOOR_ID_ERROR:
- SwiftProgressHUD.shared().showText("室内图ID错误")
- break
- case BMK_SEARCH_FLOOR_ERROR:
- SwiftProgressHUD.shared().showText("室内图检索楼层错误")
- break
- case BMK_SEARCH_INDOOR_ROUTE_NO_IN_BUILDING:
- SwiftProgressHUD.shared().showText("起终点不在支持室内路线的室内图内")
- break
- case BMK_SEARCH_INDOOR_ROUTE_NO_IN_SAME_BUILDING:
- SwiftProgressHUD.shared().showText("起终点不在同一个室内")
- break
- case BMK_SEARCH_PARAMETER_ERROR:
- SwiftProgressHUD.shared().showText("参数错误")
- break
- case BMK_SEARCH_SERVER_ERROR:
- SwiftProgressHUD.shared().showText("服务器错误")
- break
- default:
- SwiftProgressHUD.shared().showText("检索失败")
- break
- }
- }
- }
|