CoreLocation を使って iBeacon の Ranging を行う場合、iOS だと 1秒間隔で通知されます。

[参考] iBeacon(3) - リージョン監視とレンジング - Enamel Systems

そこで、1秒間隔だと通知間隔が短すぎるので、5秒間隔とか1分間隔とかに変えたい時にどうするかですが、CLLocationManager クラスに設定があればよかったのですが、特になさそうなので、RxSwift を使ってストリームのフィルタで対応する方法のメモです。

CLLocationManager の初期設定とかは参考サイトを見てください。

ReactiveX/RxSwift

1
2
3
4
5
6
locationManager.rx_didRangeBeaconsInRegion
    .sample(interval(5, MainScheduler.sharedInstance))
    .subscribeNext { (tuple: ([CLBeacon]!, CLBeaconRegion!)) in
        debugPrint("beacons: \(tuple.0), region: \(tuple.1)")
    }
    .addDisposableTo(disposeBag)

Rxsample を使って、ストリームを interval 毎にサンプリングしてやるだけです。

Time-shifted sequences - Introduction to Rx

RxSwift も使いやすくて、めっちゃ便利です!