欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-18 13:44:52
前言:关于地理位置及定位系统,在ios开发中也比较常见,比如美团外面的餐饮店铺的搜索,它首先需要用户当前手机的位置,然后在这个位置附近搜索相关的餐饮店铺的位置,并提供相关的...

前言:关于地理位置及定位系统,在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 //.
// copyright © 年 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 ., *) {
locationmanager.requestwheninuseauthorization()
} else {
// fallback on earlier versions
print("hello")
}//这个是在ios之后才有的
// 设置代理为当前对象
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 //.
// copyright © 年 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;
cllocationcoordinated coordinated = location.coordinate;
nsstring* message = [nsstring stringwithformat:@"经度:%lf,维度是:%lf",coordinated.longitude,coordinated.latitude];
uialertview* alertview = [[uialertview alloc] initwithtitle:@"显示当前位置的经纬度"                 message:message delegate:nil cancelbuttontitle:@"取消" otherbuttontitles:@"确定", nil];
[alertview show];
}
}
@end 

以上是小编给大家分享的ios入门笔记之地理位置定位系统,希望对大家有所帮助。