iOS CoreLocation定位 使用方法

更新: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做一些更改了
        
    }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值