• 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源码:

     1 //
     2 //  ViewController.swift
     3 //  LocationManager
     4 //
     5 //  Created by HEYANG on 16/1/26.
     6 //  Copyright © 2016年 HEYANG. All rights reserved.
     7 //
     8 
     9 import UIKit
    10 
    11 // 需要导入CoreLocation框架
    12 import CoreLocation
    13 
    14 class ViewController: UIViewController,CLLocationManagerDelegate {
    15 
    16     // 声明一个全局变量
    17     var locationManager:CLLocationManager!
    18     
    19     override func viewDidLoad() {
    20         super.viewDidLoad()
    21         locationManager = CLLocationManager()
    22         
    23         // 设置定位的精确度
    24         locationManager.desiredAccuracy = kCLLocationAccuracyBest
    25         
    26         // 设置定位变化的最小距离 距离过滤器
    27         locationManager.distanceFilter = 50
    28         
    29         // 设置请求定位的状态
    30         if #available(iOS 8.0, *) {
    31             locationManager.requestWhenInUseAuthorization()
    32         } else {
    33             // Fallback on earlier versions
    34             print("hello")
    35         }//这个是在ios8之后才有的
    36         
    37         // 设置代理为当前对象
    38         locationManager.delegate = self;
    39         
    40         if CLLocationManager.locationServicesEnabled(){
    41             // 开启定位服务
    42             locationManager.startUpdatingLocation()
    43         }else{
    44             print("没有定位服务")
    45         }
    46     
    47     }
    48     // 定位失败调用的代理方法
    49     func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    50         print(error)
    51     }
    52     // 定位更新地理信息调用的代理方法
    53     func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    54         if locations.count > 0
    55         {
    56             let locationInfo = locations.last!
    57             let alert:UIAlertView = UIAlertView(title: "获取的地理坐标",
    58                 message: "经度是:(locationInfo.coordinate.longitude),维度是:(locationInfo.coordinate.latitude)",
    59                 delegate: nil, cancelButtonTitle: "是的")
    60             alert.show()
    61         }
    62     }
    63 }

     下面是Objective-C的源码:

     1 //
     2 //  ViewController.m
     3 //  LocationManager
     4 //
     5 //  Created by HEYANG on 16/1/26.
     6 //  Copyright © 2016年 HEYANG. All rights reserved.
     7 //
     8 
     9 #import "ViewController.h"
    10 
    11 #import <CoreLocation/CoreLocation.h>
    12 
    13 
    14 @interface ViewController () <CLLocationManagerDelegate>
    15 
    16 /** 全局定位对象 */
    17 @property (nonatomic,strong)CLLocationManager *locationManager;
    18 
    19 @end
    20 
    21 @implementation ViewController
    22 
    23 - (void)viewDidLoad {
    24     [super viewDidLoad];
    25     
    26     CLLocationManager* locationManager = [[CLLocationManager alloc] init];
    27     
    28     // 设置定位精确度
    29     locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    30     // 设置定位变化最小距离
    31     locationManager.distanceFilter = 50;
    32     
    33     // 设置定位服务的使用状态
    34         [locationManager requestWhenInUseAuthorization];    
    35     locationManager.delegate = self;
    36     
    37     if ([CLLocationManager locationServicesEnabled]) {
    38         [locationManager startUpdatingLocation];
    39     }else{
    40         NSLog(@"本机不支持定位服务功能");
    41     }
    42     
    43     self.locationManager = locationManager;
    44 }
    45 // 定位失败调用的代理方法
    46 -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    47     NSLog(@"错误信息:%@",error);
    48 }
    49 // 定位数据更新调用的代理方法
    50 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    51     if (locations.count > 0) {
    52         CLLocation* location = locations.lastObject;
    53         CLLocationCoordinate2D coordinate2D = location.coordinate;
    54         NSString* message = [NSString stringWithFormat:@"经度:%lf,维度是:%lf",coordinate2D.longitude,coordinate2D.latitude];
    55         UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"显示当前位置的经纬度" 
                    message:message delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil]; 56 [alertView show]; 57 58 } 59 } 60 61 @end

     

     

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

     

     

     

     

     

  • 相关阅读:
    监听Windows消息
    把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论(转)
    推荐一个好工具:P/Invoke Interop Assistant (转)
    其它操作EDM的方式 (转载)
    DotNet(C#)自定义运行时窗体设计器 一
    通过监听Windows消息对复合控件进行整体控制(C#)一
    DotNet(C#)自定义运行时窗体设计器Runtime FormDesigner(转载)
    C# 枚举中的位运算
    Linux下cat 命令
    小端字节序与大端字节序
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/5161989.html
Copyright © 2020-2023  润新知