iOS之地理位置及定位系统 -- 入门笔记(用Swift)

前言:关于地理位置及定位系统,在iOS开发中也比较常见,比如美团外面的餐饮店铺的搜索,它首先需要用户当前手机的位置,然后在这个位置附近搜索相关的餐饮店铺的位置,并提供相关的餐饮信息,再比如最常见的就是地图导航,地图导航更需要定位服务,然后根据用户的目的地选出一条路线。其实,作为手机用户这么长时间,或多或少会发现在有些app应用首次在你的手机安装成功后,首次启动可能就会提示"是否同意XXx(比如百度浏览器)获取当前位置"等这样一类的信息。可见地理位置及定位系统是企业app开发必不可少的技能。

本章将提供Swift版本和Objective-C两个版本的入门代码,分别实现显示当前手机或者是模拟器的地理经纬度坐标。

 

写在正式学习前的小贴士:

这是因为xcode升级造成的定位权限设置问题。
升级xcode6、xcode7以后打开以前xcode5工程,程序不能定位。工程升级到xcode6或xcode7编译时需要iOS8 要自己写授权,不然没权限定位。
解决方法:
首先在 info.plist里加入对应的缺少的字段 ,值设置为YES(前台定位写上边字段,前后台定位写下边字段)
          NSLocationWhenInUseUsageDescription   //允许在前台获取GPS的描述
          NSLocationAlwaysUsageDescription   //允许在前、后台获取GPS的描述

设置的图示:

 

好了,如果设置好了,那就正式进入编码学习吧,首先熟悉苹果提供的关于定位服务相关的类,方法以及属性:

1、定位服务和地图应用的介绍 定位服务: 获取用户当前的位置信息,针对用户的位置信息做相关的数据处理。

地图应用: 根据实际需求展示地图和周边环境信息,基于用户当前位置展示用户所关注的地图位置信息、以及为用户导航。

  • 定位服务要掌握的:

    • 主要操作的类:CLLocationManager
    • 所属库:CoreLocation
    • 结构体:CLLocationCoordinate2D(经纬度)、CLCLocationCoorRegion(区域)
  • 地图应用需要掌握的:
    • 框架:MapKit
    • 操作类:MKMapView

2、定位服务

  • 属性:

    • desiredAccuracy设置定位精确度,这是一个常量属性,一般用best
    • distanceFilter 重新定位的最小变化距离
  • 方法:
    • 设置什么时候开启定位的状态

      • requestAlwaysAuthorization() 始终开启定位
      • requestWhenInUseAuthorization() 当app进入前台的时候开启定位(iOS8的新方法)
      • 类方法locationServicesEnabled() 是否有定位服务功能(CLLocationManager)
      • startUpdatingLocation() 开启定位
  • 代理:
    • 代理的协议:
    • 代理的方法:可以直接进入这个库的API查看,只要就是定位错误调用的代理方法,定位成功调用的代理方法等等; 
  • 涉及到的对象
    • locations: CLLocation 该CLLocation对象的属性:

      • coordinate

        • longitude/latitude
  • 英语词汇积累:
    • accuracy 英 'ækjʊrəsɪ n. [数] 精确度,准确性
    • filter 英 'fɪltə 滤波器 过滤器;筛选;滤光器 过滤;渗透;用过滤法除去

下面提供的是Swift源码:

//
//  ViewController.swift
//  LocationManager
//
//  Created by HEYANG on 16/1/26.
//  Copyright  2016年 HEYANG. All rights reserved.
//

import UIKit

// 需要导入CoreLocation框架
import CoreLocation

class ViewController: UIViewController,CLLocationManagerDelegate {

    // 声明一个全局变量
    var locationManager:CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager = CLLocationManager()

        // 设置定位的精确度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest

        // 设置定位变化的最小距离 距离过滤器
        locationManager.distanceFilter = 50

        // 设置请求定位的状态
        if #available(iOS 8.0, *) {
            locationManager.requestWhenInUseAuthorization()
        } else {
            // Fallback on earlier versions
            print("hello")
        }//这个是在ios8之后才有的

        // 设置代理为当前对象
        locationManager.delegate = self;

        if CLLocationManager.locationServicesEnabled(){
            // 开启定位服务
            locationManager.startUpdatingLocation()
        }else{
            print("没有定位服务")
        }

    }
    // 定位失败调用的代理方法
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print(error)
    }
    // 定位更新地理信息调用的代理方法
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if locations.count > 0
        {
            let locationInfo = locations.last!
            let alert:UIAlertView = UIAlertView(title: "获取的地理坐标",
                message: "经度是:\(locationInfo.coordinate.longitude),维度是:\(locationInfo.coordinate.latitude)",
                delegate: nil, cancelButtonTitle: "是的")
            alert.show()
        }
    }
}

下面是Objective-C的源码:

//
//  ViewController.m
//  LocationManager
//
//  Created by HEYANG on 16/1/26.
//  Copyright  2016年 HEYANG. All rights reserved.
//

#import "ViewController.h"

#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>

/** 全局定位对象 */
@property (nonatomic,strong)CLLocationManager *locationManager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    CLLocationManager* locationManager = [[CLLocationManager alloc] init];

    // 设置定位精确度
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    // 设置定位变化最小距离
    locationManager.distanceFilter = 50;

    // 设置定位服务的使用状态
        [locationManager requestWhenInUseAuthorization];
    locationManager.delegate = self;

    if ([CLLocationManager locationServicesEnabled]) {
        [locationManager startUpdatingLocation];
    }else{
        NSLog(@"本机不支持定位服务功能");
    }

    self.locationManager = locationManager;
}
// 定位失败调用的代理方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    NSLog(@"错误信息:%@",error);
}
// 定位数据更新调用的代理方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    if (locations.count > 0) {
        CLLocation* location = locations.lastObject;
        CLLocationCoordinate2D coordinate2D = location.coordinate;
        NSString* message = [NSString stringWithFormat:@"经度:%lf,维度是:%lf",coordinate2D.longitude,coordinate2D.latitude];
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"显示当前位置的经纬度"
                message:message delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        [alertView show];

    }
}

@end

 

 

时间: 2024-09-11 14:52:15

iOS之地理位置及定位系统 -- 入门笔记(用Swift)的相关文章

IOS入门笔记之地理位置定位系统_IOS

前言:关于地理位置及定位系统,在iOS开发中也比较常见,比如美团外面的餐饮店铺的搜索,它首先需要用户当前手机的位置,然后在这个位置附近搜索相关的餐饮店铺的位置,并提供相关的餐饮信息,再比如最常见的就是地图导航,地图导航更需要定位服务,然后根据用户的目的地选出一条路线.其实,作为手机用户这么长时间,或多或少会发现在有些app应用首次在你的手机安装成功后,首次启动可能就会提示"是否同意XXx(比如百度浏览器)获取当前位置"等这样一类的信息.可见地理位置及定位系统是企业app开发必不可少的技

MongoDB快速入门笔记(八)之MongoDB的java驱动操作代码讲解_mariadb

MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个). 下面代码给大家介绍MongoDB的java驱动操作,具体代码如下所示: import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.bson.Document; import com.mongodb.MongoClient; impo

as3移动开发入门笔记

1.不要设置applicationDPI,否则全屏在不同的设备上会有问题   2.发布时的包内容与"bin-release-temp"文件夹有关   3.src下的资源文件会自己复制到bin-debug文件夹里,如果资源文件很多很大,会导致编译很慢   4.发布的时候,包含文件里可选的只包括src文件夹下的资源文件,文件多会慢,解决的办法是设置资源文件为源路径引用.这样资源文件也会被复制到bin-debug下. 如果有不同步,只要刷新scr下的引用文件就可以了   5.Capabili

MongoDB快速入门笔记(二)之MongoDB的概念及简单操作_MongoDB

MongoDB是面向集合的文档式数据库,不像关系数据库那样,有表,列.行,mongoDB数据库则是由一系列的文档组成.下面给大家介绍MongoDB的概念及简单操作. 1.以下列举普通的关系型数据库和MongoDB数据库简单概念上的区别: 2.MongoDB的简单操作 (1)启动MongoDB数据库之后,使用命令mongo,显示如下,默认连接到test数据库. MongoDB shell version: 3.2.6 connecting to: test 使用命令show dbs,可以查看所有的

MongoDB快速入门笔记(一)之windows下安装MongoDB方法_MongoDB

MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB下载地址:http://www.mongodb.org/downloads 1.安装MongoDB 从MongoDB官网上下载MongoDB,我下载的版本是64位的3.2.6.下载完以后直接安装,我的安装目录是D:\work\MongoDB.

MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码_MongoDB

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 下面给大家介绍MongoDB查询文档操作的实例 先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, "

MongoDB快速入门笔记(三)之MongoDB插入文档操作_MongoDB

MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 本文给大家介绍MongoDB的插入文档的方法,一起看看吧 1.文档的数据存储格式为BSON,类似于JSON.MongoDB插入数据时会检验数据中是否有"_id",如果没有会自动生成. shell操作有insert和save两种方法.当插入一条数据有

苹果WWDC落幕 iOS 8、新OS X及编程语言Swift亮相

苹果WWDC落幕 iOS 8.新OS X及编程语言Swift亮相6月3日消息,苹果公司于北京时间今日凌晨1时举行全球开发者大会(WWDC),推出了全新的协同操作系统iOS 8及Mac系统OS X 10.10,此外,还推出了全新的开发者编程语言Swift(雨燕).和上一代的iOS 7相比,新的iOS 8在设计风格上没有太大变化,依旧保持了清新.美观的扁平化路线,改变主要是对通知中心.输入法.信息.邮件等功能的改进和丰富.同时,iOS 8还加入了健康监察功能Health Kit,可监察用家的心跳.血

写给IOS开发工程师的网页前端入门笔记

前言:作为IOS开发工程师,终会接触到网页前端开发,甚至可能会有 用HTML5开发IOS的app客户端的需求.比如现在上架的app就有比如理财类型的app有的就用HTML开发的,从理财类型的app需求上思考,用 HTML5确实是个不错的选择,利用了跨平台的同时,也考虑到了理财类型的app仅仅需要处理的是数据的业务逻辑,不存在较多的本地存储数据,而且涉及到 的财务信息从安全性考虑数据基本都会存储在服务器端,是不可能用于存储在本地的,再加上HTML5对各种手机屏幕的尺寸适配性非常灵活,所以这一类ap