스위프트로 비콘 관측하기.

개발 환경


Xcode 10.1
iOS 12.1
Swift4.2.1

비콘 관측 준비.


위치 정보 사용 준비


info.plist를 열고 +를 누르면 추가됩니다.

이제 다음 중 하나를 입력합니다.
어떤 것을 입력하시겠습니까? 개발하고 싶은 프로그램의 내용에 따라 변경하십시오.
자꾸 관측하고 싶은 상황.
응용 프로그램을 사용할 때만 관찰해야 하는 상황
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
그러나 iOS 11에서 "자꾸 위치 정보 가져오기"를 설정한 경우 "적용 기간 동안에만 위치 정보 가져오기 허용"옵션을 표시해야 합니다.NSLocationAlwaysUsageDescription 설정의 경우NSLocationWhenInUseUsageDescription도 필요합니다.value에 위치 정보가 어떤 목적에 쓰였는지 기술하였다.
ex) Beacon 관측용

코드

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    //beaconの値取得関係の変数
    var trackLocationManager : CLLocationManager!
    var beaconRegion : CLBeaconRegion!

    override func viewDidLoad() {
        super.viewDidLoad()

        // ロケーションマネージャを作成する
        trackLocationManager = CLLocationManager();

        // デリゲートを自身に設定
        trackLocationManager.delegate = self;

        // BeaconのUUIDを設定
        let uuid:UUID? = UUID(uuidString: "uuid")

        //Beacon領域を作成
        beaconRegion = CLBeaconRegion(proximityUUID: uuid!, identifier: "net.noumenon-th")

        // セキュリティ認証のステータスを取得
        let status = CLLocationManager.authorizationStatus()
        // まだ認証が得られていない場合は、認証ダイアログを表示
        if(status == CLAuthorizationStatus.notDetermined) {
            trackLocationManager.requestWhenInUseAuthorization()
        }
    }

    //位置認証のステータスが変更された時に呼ばれる
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        //観測を開始させる
        trackLocationManager.startMonitoring(for: self.beaconRegion)
    }

    //観測の開始に成功すると呼ばれる
    func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
        //観測開始に成功したら、領域内にいるかどうかの判定をおこなう。→(didDetermineState)へ
        trackLocationManager.requestState(for: self.beaconRegion)
    }

    //領域内にいるかどうかを判定する
    func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for inRegion: CLRegion) {

        switch (state) {
        case .inside: // すでに領域内にいる場合は(didEnterRegion)は呼ばれない
            trackLocationManager.startRangingBeacons(in: beaconRegion)
            // →(didRangeBeacons)で測定をはじめる
            break

        case .outside:
            // 領域外→領域に入った場合はdidEnterRegionが呼ばれる
            break

        case .unknown:
            // 不明→領域に入った場合はdidEnterRegionが呼ばれる
            break

        }
    }

    //領域に入った時
    func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
        // →(didRangeBeacons)で測定をはじめる
        self.trackLocationManager.startRangingBeacons(in: self.beaconRegion)
    }

    //領域から出た時
    func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
        //測定を停止する
        self.trackLocationManager.stopRangingBeacons(in: self.beaconRegion)
    }

    //領域内にいるので測定をする
    func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion){
        /*
         beaconから取得できるデータ
         proximityUUID   :   regionの識別子
         major           :   識別子1
         minor           :   識別子2
         proximity       :   相対距離
         accuracy        :   精度
         rssi            :   電波強度
         */
    }
}

좋은 웹페이지 즐겨찾기