30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iBeacon について

Last updated at Posted at 2016-04-09

以前、勉強会でたどたどしく発表させていただいたiBeaconについて書きます。
今更ながらiBeaconですが、まだ今後普及する可能性があるのではと思って書きます。。

#iBeaconとは?

  • Beaconと呼ばれる発信機から出ているBluetooth Low Energy(BLE)の信号を受信する機能。
  • 近くのお店のクーポンや商品情報を通知にすることなどに利用されている。

iBeacon利用時に必要な条件

  • Beacon機器(aplix、estimote、Gimbalなど)
    • 1個300円〜3000円くらい
    • iPhoneやMacでもOK
  • iOS7以降
  • Bluetoothが搭載されたiPhone/iPad/iPodなど
  • 位置情報「常に利用」の許可

#実装

##Beacon監視開始

Beacon監視開始
        locationManager = CLLocationManager()
        locationManager.delegate = self
        
        //iBeaconは位置情報「常に利用」の許可が必要なのでrequestAlwaysAuthorization()が必要。info.plistにもNSLocationAlwaysUsageDescriptionを追加しておく。
        if locationManager.respondsToSelector("requestAlwaysAuthorization") {
            locationManager.requestAlwaysAuthorization()
        }

   		 //ビーコン領域を生成
        let uuidString = "EBEFD083-70A2-47C8-9837-E7B5634DF524"
        let beaconIdentifier = "sample_iBeacon"
        let beaconUUID = NSUUID(UUIDString: uuidString)!
        let beaconRegion = CLBeaconRegion(proximityUUID: beaconUUID,
            identifier: beaconIdentifier)
        //let beaconRegion = CLBeaconRegion(proximityUUID: beaconUUID, major: 3, minor: 1, identifier: beaconIdentifier)
        
        //beacon領域に入ったときのdelegateからの通知がいらないときはfalse。defaultはtrue
        //beaconRegion.notifyOnEntry = false
        
        
        //beacon領域に入ったときのdelegateからの通知がいらないときはfalse。defaultはtrue
        //beaconRegion.notifyOnExit = false
        
        //iPhoneのロック解除ボタンが押されて、ロック中画面が表示されたときにBeaconの状態(内側にいるか外側にいるか)を確認するかどうか。defaultはfalse
        beaconRegion.notifyEntryStateOnDisplay = true

        //Beaconの領域IN/OUTの監視開始
        //これで、locationManager:didEnterRegion や 
        //locationManager:didExitRegionが通知される(アプリが起動していない時でも)
        //「uuidString/major/minorの組み合わせ」をbeaconRegionに指定する。
        //20個のbeaconRegionオブジェクトを監視可能
        locationManager.startMonitoringForRegion(beaconRegion)
  • locationManager.startMonitoringForRegion()を行うと、以下の「Beacon領域IN/OUTを検知(delegate)」が アプリを起動していなくても、コールバックされる。

##Beacon領域IN/OUTを検知(delegate)

  • これらは、アプリを起動していなくてもコールバックされる。その際、AppDelegateのdidFinishLaunchingWithOptionsがコールされた後に以下のdelegateメソッドがコールバックされる。
Beacon領域IN/OUTを検知(delegate)
    /**
    * beaconの領域に入った
    */
    func locationManager(manager: CLLocationManager,
        didEnterRegion region: CLRegion) {
            manager.startRangingBeaconsInRegion(region as! CLBeaconRegion)
            manager.startUpdatingLocation()
            //結構感度が良い
    }
    
    /**
     * beaconの領域から出た
     */
    func locationManager(manager: CLLocationManager,
        didExitRegion region: CLRegion) {
            //didEnterRegionに比べて感度が悪い
    }
    
    /**
     * beaconRegion.notifyEntryStateOnDisplay = true時に、iPhoneのロック解除ボタンが押されて、ロック中画面が表示された時、コールされる。
     */
    func locationManager(manager: CLLocationManager,
        didDetermineState state: CLRegionState,
        forRegion region: CLRegion) {
            //現在、対象Beaconの内側/外側/どちらかかわらないかが、stateで取得できる
    }

##Beacon領域IN/OUTのエラー検知(delegate)

Beacon領域IN/OUTのエラー検知(delegate)
    
    /**
    * beacon監視でエラー。
    */
    func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError)      {
        //ex) 監視するbeaconが無効、beaconを21種類以上登録した場合など
	}

##Beaconデータの受信開始

Beaconデータの受信開始
    
        locationManager.delegate = self
        //Beaconデータの受信開始。Beaconデータ(CLBeacon)には
               //uuid/major/minor/CLProximity(すぐ近く/近い/遠い)/rssi(信号強度)が入っている
        locationManager.startRangingBeaconsInRegion(beaconRegion)
  • locationManager.startRangingBeaconsInRegion()を行った後、以下の「Beaconデータ受信を検知(delegate)」は アプリを起動しているときだけ、コールバックされる。

##Beaconデータ受信を検知(delegate)

  • これらはアプリを起動しているときだけコールバックされる。
Beaconデータ受信を検知(delegate)
    /**
    * Beaconデータ受信処理
    */
    func locationManager(manager: CLLocationManager,
        didRangeBeacons beacons: [CLBeacon],
        inRegion region: CLBeaconRegion) {
            //Beaconデータ受信時は何度もコールされる。CLBeaconにはuuid/major/minor/CLProximity(すぐ近く/近い/遠い)/rssi(信号強度) が入っている
            //Beacon範囲に入っている時はbeaconsリストにCLBeaconオブジェクトが入っているが、
            //Beacon範囲から出てもしばらくbeaconsリストが空でコールされる。
    }

##Beaconデータ受信のエラー検知(delegate)

Beaconデータ受信のエラー検知(delegate)

    func locationManager(manager: CLLocationManager,
        rangingBeaconsDidFailForRegion region: CLBeaconRegion,
        withError error: NSError) {
        //beaconデータ受信でエラー。
        //ex) 監視するbeaconが無効など
    }

よいと思ったところ

  • iPhoneのロック解除ボタンを押した時にもBeacon検知タイミングがあるところ。これはローカル通知したいときに、ユーザーの目につきそうだと思った。
  • Beacon検知している時、ロック画面左下にアプリのアイコンが表示される。

ibeacon1.png
スマートフォンECラボ様(http://smartphone-ec.net/)

  • 省電力
    • GPSを利用した領域観測に比べてiPhoneの電池消耗が少ない
    • Beacon機器も乾電池2本でほとんどのものが1年以上は持つ。

悪いと思ったところ

  • iPhoneの電源ONにした直後1〜5分くらいBeaconを検知できない時間がある。
  • Beacon領域OUTの検知が遅いので、それを早めに検知したい時は工夫が必要そう。
    • Beaconデータ受信検知で受信データが空になった時と組み合わるなど

まとめ

  • 実装はかなり簡単(Bluetooth通信がframeworkにラップされている)。
  • アプリを起動していなくても、起動できるトリガーが多い(Beacon IN/OUT検知、ロック画面表示時)。
  • 日本でも徐々にiBeaconサービスが出てきているので今後普及するかも?
30
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?