前言:关于地理位置及定位系统,在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 = // 设置请求定位的状态
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 >
{
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 = ; // 设置定位服务的使用状态
[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 > ) {
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

转载请注明出处:http://www.cnblogs.com/goodboy-heyang/p/5161989.html

最新文章

  1. [LeetCode] All O`one Data Structure 全O(1)的数据结构
  2. chmod权限设置
  3. Visual Studio Code 怎么支持中文
  4. saltstack学习
  5. WordPress默认栏目设置
  6. Git详解之一 Git起步
  7. 笔试、面试重点总结:WIN32、MFC与Linux
  8. 【Android】用Cubism 2制作自己的Live2D——初见!
  9. [福大软工] Z班 第13次成绩排行榜
  10. [LeetCode&amp;Python] Problem 697. Degree of an Array
  11. Android:防止过快点击造成多次事件 问题
  12. 使用Log4j将程序日志实时写入Kafka(转)
  13. mysql int 整数类型 解释显示宽度 和 存储宽度
  14. Spark集群 Python Package管理
  15. [Winter Vacation] 语文实词虚词练习册答案
  16. unity的自带特性
  17. iframe 模拟ajax文件上传and formdata ajax 文件上传
  18. Entity Framework Tutorial Basics(1):Introduction
  19. Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入
  20. thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。

热门文章

  1. Mina、Netty、Twisted一起学(一):实现简单的TCP服务器
  2. 100款免费的圣诞节矢量图标素材(PSD &amp; SVG)
  3. log4j的一些问题
  4. 如何单独启动wamp 中自带的MySQL
  5. Mysql查询大表出现的一个错误
  6. CSS布局 -- 左侧定宽,右侧自适应
  7. AnyChatCoreSDK.h
  8. 安装 Oracle P6 EPPM 16 R1 database for 12C
  9. 2016ASP.NET使用QQ邮箱发送信息最全+无错误
  10. Array(数组)与Json String (Json字符串) 的相互转换