IOS에서 IBeacon을 사용하는 방법

8506 단어 IOSIBeacon

아이비콘이 뭐예요?

iBeacon는 애플이 2013년 9월 발표한 모바일 기기용 OS(iOS7)에 탑재된 새로운 기능이다.저전력 블루투스(BLE) 통신 기능을 갖춘 장치는 BLE 기술을 사용하여 주위에 고유한 ID를 전송하고 해당 ID를 수신한 응용 프로그램은 해당 ID에 따라 조치를 취합니다.
개인적인 측면에서 보면 iBeacon 사방팔방으로 끊임없이 신호를 방송하는데 마치 잔잔한 수면에 돌을 던져 층층이 잔잔한 물결을 일으키는 것 같다. 물결은 아이비콘의 RSSI (신호 강도 지시를 받음) 중심점에 가까울수록 물결이 높아진다(RSSI가 커진다). 이 물결의 크기(RSSI의 값)는 돌을 던질 때 힘의 크기(발사 전력)와 수질(주변 환경 인자)의 영향을 받는다.중심점에서 멀어질수록 물결은 평온해지고 일정치를 초과하면 물결은 무형으로 사라진다. 즉, 아이비콘이 밖으로 방송하는 거리는 범위가 있고 이 범위를 초과하면 아이비콘의 신호를 받아들일 수 없다.
iOS 개발자의 측면에서 볼 때 iBeacon은 CoreLocation 프레임워크에서 CLBeacon 클래스로 추상화되었다. 이 클래스는 6개의 속성이 있는데 각각 다음과 같다.
  • proximityUUID, NSUUID로 회사를 표시하는 데 쓰인다.회사, 조직마다 사용하는 iBeacon은 동일proximityUUID을 가져야 한다.
  • major, 주요 값은 한 그룹의 관련 비콘을 식별하는 데 사용된다. 예를 들어 체인 슈퍼마켓의 장면에서 각 지점의 비콘은 같은 것을 가져야 한다major.
  • minor, 부차적인 값은 특정한 비콘을 구분하는 데 쓰인다.
  • proximity, 원근 범위의 매거값.
  • 
    typedef NS_ENUM(NSInteger, CLProximity) {
    	CLProximityUnknown,//  
    	CLProximityImmediate,// 
    	CLProximityNear,// 
    	CLProximityFar//  10  , 10 far
    }
    
  • accuracy, 아이비콘과의 거리.
  • rssi, 신호의 경도는 마이너스이고 0신호에 가까울수록 강하며 0시 신호를 얻을 수 없는 강도와 같다.
  • Tip: proximityUUID, major, minor 이 세 가지 속성으로 구성된 유일한 식별자입니다.iBeacon의 범위에 들어가면 프로그램이 죽은 상황에서도 앱을 깨울 수 있다(약 10초).필요할 때 iBeacon류의 UIApplication 방법을 사용하여 더 많은 백그라운드 실행 시간을 요청할 수 있습니다.
    iBeacon의 용도: 우리는 - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;로 실내 포지셔닝(차고, 백화점), 스마트 카드놀이, 알림(어떤 물체를 떠날 때, 예를 들어 집을 떠날 때)을 할 수 있다.

    iBeacon과 BLE의 차이점


    iOS에서 iBeacon은 지리적 위치를 바탕으로 하는 마이크로 포지셔닝 기술로 휴대전화 블루투스를 빌려 수신iBeacon,Majro을 하지만 이들은 개발 공정에서 아무런 관계가 없다.Minor 애플이 제공하는 iBeacon 라이브러리를 사용하지만 BLE는 개발 과정에서 CoreLocation 라이브러리를 사용한다.위에서 제공한 라이브러리를 보면 알 수 있다. 특히 iOS8.0 이후 CoreBluetooth 를 사용하려면 iBeacon 지리적 위치 사용 허용 여부를 클릭해야 한다.iOS App 스캔XXapp을 처음 사용할 때 알림이 없으면 iBeacon 신호를 받을 수 없습니다. (iOS 8.0 이하가 아니라면)BLE의 경우 개발 과정에서 블루투스를 켜야 하며 다른 지리적 위치에 대한 정보를 요구하지 않습니다.

    iBeacon의 iOS에서의 활용


    권한 요청

    iBeacon에 추가info.plist, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription, 지리적 위치 권한을 요청합니다.
    켜기NSLocationAlwaysUsageDescription

    관련 코드


    import Background Modes .
    초기화<CoreLocation/CoreLocation.h>locationManager.
    
    - (CLLocationManager *)locationManager {
        if (!_locationManager) {
            _locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
        }
        return _locationManager;
    }
    
    - (CLBeaconRegion *)beaconRegion {
        if (!_beaconRegion) {
            _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:Beacon_Device_UUID] identifier:@"test"];
            _beaconRegion.notifyEntryStateOnDisplay = YES;
        }
        return _beaconRegion;
    }
    
    beaconRegion 클래스는 세 가지 초기화 방법을 제공합니다.
    
    // UUID Beacon 
    - (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier;
    
    // UUID,major Beacon 
    - (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major identifier:(NSString *)identifier;
    
    // Beacon 
    - (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor identifier:(NSString *)identifier;
    
    모니터링을 시작하기 전에 장치가 지원되는지, 지리적 위치에 접근할 수 있는지 판단해야 합니다.
    
    BOOL availableMonitor = [CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]];
    
    if (availableMonitor) {
        CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
        switch (authorizationStatus) {
            case kCLAuthorizationStatusNotDetermined:
                [self.locationManager requestAlwaysAuthorization];
            break;
            case kCLAuthorizationStatusRestricted:
            case kCLAuthorizationStatusDenied:
                NSLog(@" ");
            break;
            case kCLAuthorizationStatusAuthorizedAlways:
            case kCLAuthorizationStatusAuthorizedWhenInUse:{
                [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
                [self.locationManager startMonitoringForRegion:self.beaconRegion];
            }
            break;
        }
    } else {
        NSLog(@"  CLBeaconRegion  ");
    }
    

    감청 방식


    두 가지 방법으로 영역CLBeaconRegion 또는 isMonitoringAvailableForClass 측정 가능
    Monitoring: 장치가 특정한 지리 구역에 들어가거나 종료할 때 알림을 받을 수 있습니다. 이런 방법을 사용하면 프로그램의 백그라운드가 실행될 때 iBeacon을 검출할 수 있지만 20개의region 구역만 동시에 검출할 수 있고 장치와 iBeacon의 거리를 추측할 수 없습니다.
    
    //  
    [self.locationManager startMonitoringForRegion:beaconRegion]; 
    
    //  
    [self.locationManager stopMonitoringForRegion:beaconRegion]; 
    
    // Monitoring 
    - (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region;
    
    //  
    - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region;
    
    //  
    - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region;
    
    // Monitoring 
    - (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(nullable CLRegion *)region withError:(NSError *)error;
    
    Ranging: 특정 영역 내의 모든 iBeacons를 검사하는 데 사용할 수 있습니다.
    
    //  
    [self.locationManager startRangingBeaconsInRegion:beaconRegion];
    
    //  
    [self.locationManager stopRangingBeaconsInRegion:beaconRegion];
    
    // Ranging 
    - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray<CLBeacon *> *)beacons inRegion:(CLBeaconRegion *)region 
    
    // Ranging 
    - (void)locationManager:(CLLocationManager *)manager rangingBeaconsDidFailForRegion:(CLBeaconRegion *)region withError:(NSError *)error
    

    프로세스kill 후 iBeacon 영역에 들어가는 리셋

    
    //  , ibeacon , /   
    - (void)locationManager:(CLLocationManager *)manager
          didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
    

    더 많은 백스테이지 시간을 쟁취하다


    필요할 때 Monitoring류의 Ranging 방법을 사용하여 더 많은 백그라운드 실행 시간을 요청할 수 있습니다.

    [아이폰으로 아이비콘 시뮬레이션]


    Bluetooth 저전력 공유 데이터를 지원하는 iOS 장치는 모두 사용할 수 있습니다 UIApplication.
    import- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;iBeacon<CoreBluetooth/CoreBluetooth.h>에서 <CoreLocation/CoreLocation.h> 명령을 사용하여 UUIDterminal를 생성합니다.
    사실 uuidgen을 이용하여 비콘 장치의 신호를 시뮬레이션하는 것은 매우 간단하다.

    관련 코드


    초기화063FA845-F091-4129-937D-2A189A86D844
    
    self.peripheralManager= [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];
    
    신호를 보내다
    
    NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDString:self.UUIDTextField.text];
    // beacon 
    CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:proximityUUID major:self.majorTextField.text.integerValue minor:self.minorTextField.text.integerValue identifier:@"test"];
    NSDictionary *beaconPeripheraData = [beaconRegion peripheralDataWithMeasuredPower:nil];
    
    if(beaconPeripheraData) {
        [self.peripheralManager startAdvertising:beaconPeripheraData];;// 
    }
    
    방송을 중지하다
    
    [self.peripheralManager stopAdvertising];

    주의점

  • 지리적 액세스 권한이 필요합니다.
  • 장치는 블루투스를 켜야 한다.
  • iOS 장치를 이용하여 비콘 신호를 시뮬레이션하면 홈이 나간 후에는 신호를 보낼 수 없다.
  • 이상은 IOS에서 IBeacon을 어떻게 사용하는지에 대한 상세한 내용입니다. IOS에서 IBeacon에 대한 더 많은 자료는 저희의 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기