一、简单说明
 

1.CLLocationManager
 
CLLocationManager的常用操作和属性
 
开始用户定位- (void)startUpdatingLocation;
 
停止用户定位- (void) stopUpdatingLocation;
 
说明:当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法

  - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

每隔多少米定位一次
  @property(assign, nonatomic) CLLocationDistance distanceFilter;

定位精确度(越精确就越耗电)
  @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

 
 
2.CLLocation
 
CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等
 
(1)经纬度
  @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

(2)海拔
  @property(readonly, nonatomic) CLLocationDistance altitude;

(3)路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向)
  @property(readonly, nonatomic) CLLocationDirection course;

(4)行走速度(单位是m/s)
   @property(readonly, nonatomic) CLLocationSpeed speed;

(5)计算2个位置之间的距离
  - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location方法

 
 
3.CLLocationCoordinate2D
 
CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下
typedef struct {

 

        CLLocationDegrees latitude; // 纬度

 

        CLLocationDegrees longitude; // 经度

 

} CLLocationCoordinate2D;

一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D
 
 
 
二、代码示例
//

//  YYViewController.m

//  18-定位服务

//

//  Created by apple on 14-8-9.

//  Copyright (c) 2014年 yangyong. All rights reserved.

//
#import "YYViewController.h"

#import 
//需要遵守CLLocationManagerDelegate协议

@interface YYViewController ()

@property(nonatomic,strong)CLLocationManager *locMgr;

@end
@implementation YYViewController

#pragma mark-懒加载

-(CLLocationManager *)locMgr

{

    if (_locMgr==nil) {

        //1.创建位置管理器(定位用户的位置)

        self.locMgr=[[CLLocationManager alloc]init];

        //2.设置代理

        self.locMgr.delegate=self;

    }

    return _locMgr;

}

- (void)viewDidLoad

{

    [super viewDidLoad];

    

    //判断用户定位服务是否开启

    if ([CLLocationManager locationServicesEnabled]) {

        //开始定位用户的位置

        [self.locMgr startUpdatingLocation];

        //每隔多少米定位一次(这里的设置为任何的移动)

        self.locMgr.distanceFilter=kCLDistanceFilterNone;

        //设置定位的精准度,一般精准度越高,越耗电(这里设置为精准度最高的,适用于导航应用)

        self.locMgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;

    }else

    {//不能定位用户的位置

        //1.提醒用户检查当前的网络状况

        //2.提醒用户打开定位开关

    }

    

    //测试方法,计算两个位置之间的距离

    [self countDistance];

}
#pragma mark-CLLocationManagerDelegate

/**

 *  当定位到用户的位置时,就会调用(调用的频率比较频繁)

 */

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

{

    //locations数组里边存放的是CLLocation对象,一个CLLocation对象就代表着一个位置

   CLLocation *loc = [locations firstObject];

    

    //维度:loc.coordinate.latitude

    //经度:loc.coordinate.longitude

    NSLog(@"纬度=%f,经度=%f",loc.coordinate.latitude,loc.coordinate.longitude);

    NSLog(@"%d",locations.count);

    

    //停止更新位置(如果定位服务不需要实时更新的话,那么应该停止位置的更新)

//    [self.locMgr stopUpdatingLocation];

 

}
//计算两个位置之间的距离

-(void)countDistance

{

    //根据经纬度创建两个位置对象

    CLLocation *loc1=[[CLLocation alloc]initWithLatitude:40 longitude:116];

    CLLocation *loc2=[[CLLocation alloc]initWithLatitude:41 longitude:116];

    //计算两个位置之间的距离

    CLLocationDistance distance=[loc1 distanceFromLocation:loc2];

    NSLog(@"(%@)和(%@)的距离=%fM",loc1,loc2,distance);

}
@end

打印查看:

代码说明:
 
1.关于代理方法
 
  需要设置代理,通过代理告诉用户当前的位置,有两个代理方法:
 
  locations参数里面装着CLLocation对象

其中后者是一个过期的方法,在新的方法(第一个)中使用了一个数组来替代。
 
说明:该方法在当定位到用户的位置时就会调用,调用比较频繁
 
注意:不要使用局部变量(创建位置管理器),因为局部变量的方法结束它就被销毁了。建议使用一个全局的变量,且只创建一次就可以了(使用懒加载)。
 
2.定位的精度

3.如果发现自己的定位服务没有打开,那么应该提醒用户打开定位服务功能。
 
4.定位服务是比较耗电的,如果是做定位服务(没必要实时更新的话),那么定位了用户位置后,应该停止更新位置。
 
 
 
三、用户隐私的保护
 

1.权限设置说明
 
从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权
 
(1)要想获得用户的位置
 
(2)想访问用户的通讯录、日历、相机、相册等
 
当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权

注意:一旦用户选择了“Don't Allow”,意味着你的应用以后就无法使用定位功能,且当用户第一次选择了之后,以后就再也不会提醒进行设置。
 
因此在程序中应该进行判断,如果发现自己的定位服务没有打开,那么应该提醒用户打开定位服务功能。
 
CLLocationManager有个类方法可以判断当前应用的定位功能是否可用 (BOOL)locationServicesEnabled;
 
  常用的方法:截图告诉用户,应该怎么打开授权
 
  
 
2.开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)

说明:这里的定位服务是基于网络的。通常定位服务可以是基于GPS、基站或者是网络的。


四、iOS8以来的改进
iOS 8 还提供了更加人性化的定位服务选项。App 的定位服务不再仅仅是关闭或打开,现在,定位服务的启用提供了三个选项,「永不」「使用应用程序期间」和「始终」。同时,考虑到能耗问题,如果一款 App 要求始终能在后台开启定位服务,iOS 8 不仅会在首次打开 App 时主动向你询问,还会在日常使用中弹窗提醒你该 App 一直在后台使用定位服务,并询问你是否继续允许。在iOS7及以前的版本,如果在应用程序中使用定位服务只要在程序中调用startUpdatingLocation方法应用就会询问用户是否允许此应用是否允许使用定位服务,同时在提示过程中可以通过在info.plist中配置通过配置Privacy - Location Usage Description告诉用户使用的目的,同时这个配置是可选的。
但是在iOS8中配置配置项发生了变化,可以通过配置NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription来告诉用户使用定位服务的目的,并且注意这个配置是必须的,如果不进行配置则默认情况下应用无法使用定位服务,打开应用不会给出打开定位服务的提示,除非安装后自己设置此应用的定位服务。同时,在应用程序中需要根据配置对requestAlwaysAuthorization或locationServicesEnabled方法进行请求。由于本人机器已经更新到最新的iOS8.1下面的内容主要针对iOS8,使用iOS7的朋友需要稍作调整。

//

//  KCMainViewController.m

//  CoreLocation

//

//  Created by Kenshin Cui on 14-03-27.

//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.

//
#import "KCMainViewController.h"

#import 
@interface KCMainViewController (){
    CLLocationManager *_locationManager;

}
@end
@implementation KCMainViewController
- (void)viewDidLoad {

    [super viewDidLoad];

    

    //定位管理器

    _locationManager=[[CLLocationManager alloc]init];

    

    if (![CLLocationManager locationServicesEnabled]) {

        NSLog(@"定位服务当前可能尚未打开,请设置打开!");

        return;

    }

    

    //如果没有授权则请求用户授权

    if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){

        [_locationManager requestWhenInUseAuthorization];

    }else if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){

        //设置代理

        _locationManager.delegate=self;

        //设置定位精度

        _locationManager.desiredAccuracy=kCLLocationAccuracyBest;

        //定位频率,每隔多少米定位一次

        CLLocationDistance distance=10.0;//十米定位一次

        _locationManager.distanceFilter=distance;

        //启动跟踪定位

        [_locationManager startUpdatingLocation];

    }

}
#pragma mark - CoreLocation 代理

#pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定位到相应位置)

//可以通过模拟器设置一个虚拟位置,否则在模拟器中无法调用此方法

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

    CLLocation *location=[locations firstObject];//取出第一个位置

    CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标

    NSLog(@"经度:%f,纬度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);

    //如果不需要实时定位,使用完即使关闭定位服务

    [_locationManager stopUpdatingLocation];

}
@end

注意:
 
1.定位频率和定位精度并不应当越精确越好,需要视实际情况而定,因为越精确越耗性能,也就越费电。
 
2.定位成功后会根据设置情况频繁调用-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations方法,这个方法返回一组地理位置对象数组,每个元素一个CLLocation代表地理位置信息(包含经度、纬度、海报、行走速度等信息),之所以返回数组是因为有些时候一个位置点可能包含多个位置。
 
3.使用完定位服务后如果不需要实时监控应该立即关闭定位服务以节省资源。
 
4.除了提供定位功能,CLLocationManager还可以调用startMonitoringForRegion:方法对指定区域进行监控。

讲解iOS开发中基本的定位功能实现的更多相关文章

  1. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  2. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  4. ios – Testflight无法安装应用程序

    我有几个测试人员注册了testflight并连接了他们的设备……他们有不同的ios型号……但是所有这些都有同样的问题.当他们从“safari”或“testflight”应用程序本身单击应用程序的安装按钮时……达到约90%并出现错误消息…

  5. ibm-mobilefirst – 在iOS 7.1上获取“无法安装应用程序,因为证书无效”错误

    当我的客户端将他们的设备更新到iOS7.1,然后尝试从AppCenter更新我们的应用程序时,我收到了上述错误.经过一番搜索,我找到了一个类似问题的帖子here.但是后来因为我在客户端使用AppCenter更新应用程序的环境中,我无法使用USB插件并为他们安装应用程序.在发布支持之前,是否有通过AppCenter进行下载的解决方法?

  6. ios – 视图的简单拖放?

    我正在学习iOS,但我找不到如何向UIView添加拖放行为.我试过了:它说“UIView没有可见的接口声明选择器addTarget”此外,我尝试添加平移手势识别器,但不确定这是否是我需要的它被称为,但不知道如何获得事件的坐标.在iOS中注册移动事件回调/拖放操作的标准简单方法是什么?

  7. ios – 什么控制iTunes中iPhone应用程序支持的语言列表?

    什么控制iPhone应用程序的iTunes页面中支持的语言?

  8. ios – 获得APNs响应BadDeviceToken或Unregistered的可能原因是什么?

    我知道设备令牌在某些时候是有效的.用户如何使其设备令牌变坏?从关于“未注册”的文档:Thedevicetokenisinactiveforthespecifiedtopic.这是否意味着应用程序已被删除?.您应该看到四种分发方法:如果您选择AppStore或Enterprise,您将在后面的对话框中看到Xcode将APNS权利更改为生产:如果选择AdHoc或Development,则aps-environment下的文本将是开发,然后应与后端的配置匹配.

  9. ios – 当我关闭应用程序时,我从调试器获得消息:由于信号15而终止

    我怎么能解决这个问题,我不知道这个链接MypreviousproblemaboutCoredata对我的问题有影响吗?当我cmd应用程序的Q时,将出现此消息.Messagefromdebugger:Terminatedduetosignal15如果谁知道我以前的问题的解决方案,请告诉我.解决方法>来自调试器的消息:每当用户通过CMD-Q(退出)或STOP手动终止应用程序(无论是在iOS模拟器中还是

  10. ios – NSUbiquityIdentityDidChangeNotification和SIGKILL

    当应用程序被发送到后台时,我们会删除观察者吗?我遇到的问题是,当UbiquityToken发生变化时,应用程序终止,因为用户已经更改了iCloud设置.你们如何设法订阅这个通知,如果你不这样做,你会做什么来跟踪当前登录的iCloud用户?

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部