iOS 개발 의 기본 적 인 포 지 셔 닝 기능 실현 설명

11199 단어 iOS포 지 셔 닝
간단 한 설명
 
1.CLLocationManager
 
CLLocationManager 의 일반적인 동작 과 속성
 
사용자 포 지 셔 닝 시작-(void)startUpdatingLocation;
 
사용자 위치 정지-(void)stopUpdatingLocation;
 
설명:startUpdating Location 방법 을 호출 한 후에 사용자 의 위 치 를 계속 찾 기 시 작 했 고 중간 에 대리 의 아래 방법 을 자주 호출 할 것 입 니 다.
 
  - (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)두 위치 사이 의 거 리 를 계산한다.
 
  - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

 
 
3.CLLocationCoordinate2D
 
CLLocationCoordinate2D 는 경 위 를 나타 내 는 구조 체 로 다음 과 같이 정의 합 니 다.
 
typedef struct {
 
        CLLocationDegrees latitude; //
 
        CLLocationDegrees longitude; //
 
} CLLocationCoordinate2D;

보통 CLLocationCoordinate2D Make 함수 로 CLLocationCoordinate2D 를 만 듭 니 다.
 
 
 
코드 예시

//
//  YYViewController.m
//  18-
//
//  Created by apple on 14-8-9.
//  Copyright (c) 2014 yangyong. All rights reserved.
//

#import "YYViewController.h"
#import <CoreLocation/CoreLocation.h>

// CLLocationManagerDelegate
@interface YYViewController ()<CLLocationManagerDelegate>
@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.포 지 셔 닝 서 비 스 는 전기 소모 가 많 습 니 다.포 지 셔 닝 서 비 스 를 하 는 경우(실시 간 으로 업데이트 할 필요 가 없다 면)사용자 의 위 치 를 정 한 후에 업데이트 위 치 를 중지 해 야 합 니 다.
 
 
 
3.사용자 의 프라이버시 보호
 
1.권한 설정 설명
 
iOS 6 부터 애플 은 사용자 의 프라이버시 를 보호 하 는 데 큰 강 화 를 했 고 다음 과 같은 조작 은 반드시 사용자 의 비준 을 거 쳐 권한 을 부여 해 야 한다.
 
(1)사용자 의 위 치 를 얻 으 려 면
 
(2)사용자 의 주소록,달력,카메라,앨범 등 을 방문 하고 싶 습 니 다.
 
사용자 의 프라이버시 정 보 를 방문 하려 면 시스템 에서 사용자 에 게 권한 을 부여 하 는 대화 상자 가 자동 으로 팝 업 됩 니 다.

메모:사용자 가'Don't Allow'를 선택 하면 애플 리 케 이 션 이후 포 지 셔 닝 기능 을 사용 할 수 없 음 을 의미 하 며 사용자 가 처음 선택 한 후에 다 시 는 설정 을 알 리 지 않 습 니 다.
 
따라서 프로그램 에서 자신의 포 지 셔 닝 서비스 가 열 리 지 않 은 것 을 발견 하면 사용자 에 게 포 지 셔 닝 서비스 기능 을 켜 라 고 알려 야 한다.
 
CLLocationManager 는 현재 응용 되 고 있 는 포 지 셔 닝 기능 이+(BOOL)locationServicesEnabled 를 사용 할 수 있 는 지 판단 할 수 있 는 방법 이 있 습 니 다.
 
자주 사용 하 는 방법:캡 처 를 통 해 사용자 에 게 인증 서 를 어떻게 열 어야 하 는 지 알려 줍 니 다.
 
  
 
2.개발 자 는 Info.plist 에 NSLocationUsage Description 을 설정 하여 포 지 셔 닝 의 목적 을 설명 할 수 있 습 니 다(Privacy-Location Usage Description)

설명:이곳 의 포 지 셔 닝 서 비 스 는 네트워크 를 바탕 으로 한다.일반적으로 포 지 셔 닝 서 비 스 는 GPS,기지 국 또는 네트워크 를 바탕 으로 할 수 있다.
4.iOS 8 이후 의 개선
iOS 8 은 보다 인간 적 인 포 지 셔 닝 서비스 옵션 도 제공한다.App 의 포 지 셔 닝 서 비 스 는 닫 거나 열 리 는 것 이 아 닙 니 다.현재 포 지 셔 닝 서비스의 사용 은 세 가지 옵션 을 제공 합 니 다.'영원히','응용 프로그램 을 사용 하 는 동안','항상'입 니 다.또한 에너지 소모 문 제 를 고려 하여 만약 에 앱 이 백 스테이지 에서 위치 추적 서 비 스 를 계속 시작 할 수 있 도록 요구한다 면 iOS 8 은 앱 을 처음 열 때 자발적으로 물 어 볼 뿐만 아니 라 일상적인 사용 에서 팝 업 창 은 앱 이 백 스테이지 에서 위치 추적 서 비 스 를 계속 사용 하 는 지 알려 주 고 계속 허용 하 는 지 물 어 볼 것 이다.iOS 7 및 이전 버 전에 서 는 프로그램 에서 포 지 셔 닝 서 비 스 를 사용 할 경우 프로그램 에서 startUpdatingLocation 방법 을 사용 하면 사용자 에 게 포 지 셔 닝 서 비 스 를 사용 할 수 있 는 지 여 부 를 물 어 볼 수 있 으 며,알림 과정 에서 info.plist 에 개인 정보-Location Usage 설정 을 통 해 사용 목적 을 알려 줄 수 있 습 니 다.동시에 이 설정 은 선택 할 수 있 습 니 다.
그러나 iOS 8 에서 설정 항목 이 바 뀌 었 습 니 다.NSLocationAlways Usage Description 이나 NSLocationWhenInUseUsage Description 을 설정 하여 사용자 에 게 포 지 셔 닝 서 비 스 를 사용 하 는 목적 을 알려 줄 수 있 습 니 다.또한 이 설정 이 필요 합 니 다.설정 을 하지 않 으 면 기본 적 인 상황 에서 포 지 셔 닝 서 비 스 를 사용 할 수 없습니다.응용 프로그램 을 열 면 포 지 셔 닝 서 비 스 를 여 는 힌트 를 주지 않 습 니 다.설치 후 이 앱 의 위치 추적 서 비 스 를 스스로 설정 하지 않 는 한또한 응용 프로그램 에 서 는 requestAlwaysAuthorization 이나 locationServicesEnabled 방법 을 설정 에 따라 요청 해 야 합 니 다.본인 의 기계 가 최신 iOS 8.1 로 업데이트 되 었 기 때문에 아래 의 내용 은 주로 iOS 8 을 대상 으로 하고 iOS 7 을 사용 하 는 친 구 는 약간 조정 해 야 합 니 다.

//
//  KCMainViewController.m
//  CoreLocation
//
//  Created by Kenshin Cui on 14-03-27.
//  Copyright (c) 2014 Kenshin Cui. All rights reserved.
//

#import "KCMainViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface KCMainViewController ()<CLLocationManagerDelegate>{

    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:방법 으로 지 정 된 구역 을 모니터링 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기