美文网首页
地图和定位(一)

地图和定位(一)

作者: weyan | 来源:发表于2020-03-07 16:14 被阅读0次

地理编码: 广州市天河区xx街盛达商务区 -------> 113.23456 , 23.498897
反地理编码:113.23456 , 23.498897 --------> 广州市天河区xx街盛达商务区

一、定位

1、iOS8.0之前的定位

用户隐私 开启后台定位
-------------------------------ViewController.swift---------------------------------
import UIKit
import CoreLocation

class ViewController: UIViewController {
    var locationManager: CLLocationManager?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //开始获取用户的位置信息
        
        //1.创建位置管理者
        locationManager = CLLocationManager()
        //1.1设置代理
        locationManager!.delegate = self
        //2.使用位置管理者,开始获取用户的位置信息
        //小经验:如果想要使用位置管理者实现某个服务,可以以start开始某个服务,stop结束某个服务
        //ing意味着,一旦调用了这个方法,就会不断的获取用户的位置信息,然后告诉外界
        locationManager!.startUpdatingLocation()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

extension ViewController:CLLocationManagerDelegate {
    /**更新到位置信息时调用
     * manager: 位置管理者
     * location: 位置数组
     */
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("定位到了")
    }
}

2、 iOS8.0之后的定位

(1).iOS8.0之后的前台定位

-----------------------------ViewController.swift----------------------------------
import UIKit
import CoreLocation

class ViewController: UIViewController {
    //懒加载创建一个位置管理者
    lazy var locationManager: CLLocationManager = {
        let locationM = CLLocationManager()
        locationM.delegate = self
        //请求授权
        //请求前台定位授权
        //使用这个方法,一定要注意需要在info.plist文件里面配置对应的key
        if #available(iOS 8.0, *){
            locationM.requestWhenInUseAuthorization()
        }
        return locationM
    }()
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //开始获取用户位置信息
        locationManager.startUpdatingLocation()
    }

}

extension ViewController: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("已经获取到了位置信息")
    }
}

2、iOS8.0之后的后台定位
方案一:

方案二:

3、iOS9.0之后的定位

-------------------------ViewController.swift------------------------
import UIKit
import CoreLocation

class ViewController: UIViewController {
    //懒加载创建一个位置管理者
    lazy var locationManager: CLLocationManager = {
        let locationM = CLLocationManager()
        locationM.delegate = self
        //在ios8.0之后,需要主动请求授权
        //一定不要忘记在info.plist文件中配置key
        if #available(iOS 8.0, *){
            locationM.requestWhenInUseAuthorization()
            if #available(iOS 9.0, *){
                //默认情况下只能在前台获取用户位置信息,如果想要在后台获取需要勾选后台模式location updates,但是如果当前的系统版本是iOS9.0+,那么需要额外的执行以下方法
                //如果设置这样的属性为true,那么必须勾选后台模式,否则会崩溃。(和iOS8.0的后台定位区别就在于下面这句代码)
                locationM.allowsBackgroundLocationUpdates = true
            }
        }
        
        return locationM
    }()
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //开始获取用户位置信息
        self.locationManager.startUpdatingLocation()
    }

}

extension ViewController: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("已经获取到了位置信息")
    }
}

4、监听用户授权状态

iOS8.0之前定位提醒用户开启定位跳转到设置界面需要设置 URL Types
------------------ViewController.swift------------------
import UIKit
import CoreLocation

class ViewController: UIViewController {
    //懒加载创建一个位置管理者
    lazy var locationManager: CLLocationManager = {
        let locationM = CLLocationManager()
        locationM.delegate = self
        //在ios8.0之后,需要主动请求授权
        //一定不要忘记在info.plist文件中配置key
        if #available(iOS 8.0, *){
            locationM.requestWhenInUseAuthorization()
//            locationM.requestAlwaysAuthorization()
            if #available(iOS 9.0, *){
                //默认情况下只能在前台获取用户位置信息,如果想要在后台获取需要勾选后台模式location updates,但是如果当前的系统版本是iOS9.0+,那么需要额外的执行以下方法
                //如果设置这样的属性为true,那么必须勾选后台模式,否则会崩溃。(和iOS8.0的后台定位区别就在于下面这句代码)
                locationM.allowsBackgroundLocationUpdates = true
            }
        }
        
        return locationM
    }()
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //开始获取用户位置信息
        self.locationManager.startUpdatingLocation()
    }

}

extension ViewController: CLLocationManagerDelegate {
    //获取用户位置信息
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("已经获取到了位置信息")
    }
    /**如果当前的授权状态发生变化时调用
   * manager:位置管理者
   * status: 授权状态
   */
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
        case CLAuthorizationStatus.notDetermined:
            print("用户没有决定")
        case CLAuthorizationStatus.restricted:
            print("受限制")
        case CLAuthorizationStatus.authorizedAlways:
            print("前后台定位授权")
        case CLAuthorizationStatus.authorizedWhenInUse:
            print("前台定位授权")
        case CLAuthorizationStatus.denied:
            if CLLocationManager.locationServicesEnabled(){
                print("真正的被拒绝")
                //如果以后再开发过程中,发现已经被用户拒绝了我们应该提醒用户
                //这边只写跳转的关键代码
                
                //注意:这个跳转只能在iOS8.0之后才能跳转到设置界面
                if #available(iOS 8.0, *){
                    let url: NSURL? = NSURL(string: UIApplicationOpenSettingsURLString)
                    if UIApplication.shared.canOpenURL(url! as URL){
                        UIApplication.shared.openURL(url! as URL)
                    }
                }
                
                //如果想要在iOS8.0之前跳转到设置界面方法
                //1.可以一步一步的截图告诉用户该怎么操作
                //2.prefs:root=LOCATION_SERVICES
//                guard let url: NSURL = NSURL(string: "prefs:root=LOCATION_SERVICES") else {
//                    return
//                }
//                if UIApplication.shared.canOpenURL(url as URL){
//                    UIApplication.shared.openURL(url as URL)
//                }
            }else {
                print("请打开定位服务")
            }
            
        }
    }
}

相关文章

  • 地图和定位(一)

    广州市天河区xx街盛达商务区 -------> 113.23456 , 23.498897 113.23456 ,...

  • 定位和地图

    为了使用iOS中的地图和定位功能,我们需要使用Core Location和Map Kit,分别用于地理定位和地图展...

  • 高德API使用小结-定位和marker

    功能描述:实现一个普通的地图展示,地图上有当前定位小蓝点和门店定位Marker信息。当前定位需要从定位服务异步获取...

  • 自定义大头针

    定位和地图可以分开使用 配置时需要条件编译 //地图的头文件 #import //定位的头文件 #import /...

  • 定位CoreLocation

    一、定位介绍 现在很多社交、电商、团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的。的...

  • iOS学习笔记19-地图(一)定位CoreLocation

    一、定位介绍 现在很多社交、电商、团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的。的...

  • 集成百度地图遇到过的那些坑:(反geo检索发送失败)

    因为公司项目需求,需要集成百度地图实现定位功能和反地理编码功能。本人以前集成过百度地图完成过定位功能、地图显示和...

  • 基于fabric的地图定位,SVG热力地图

    基于fabric的地图定位,SVG热力地图 基于fabric的地图定位,SVG热力地图 基于 fabricjs v...

  • 地图定位的不显示

    苹果自带地图定位功能 地图定位 今天要做苹果自带地图定位功能,基于mapkit框架的。怎么也没有找到定位自己的位置...

  • iOS定位和地图

    一.定位 1.iOS8以后前台定位 A.代码 B.配置信息Info.plist 2.iOS8以后后台定位 A.代码...

网友评论

      本文标题:地图和定位(一)

      本文链接:https://www.haomeiwen.com/subject/gkvnmqtx.html