image


ChatWorkアドベントカレンダー3日目の記事です。
2日目の安宅記事からのバトンをうけとります。

どうも、アプリケーション開発部でiOSアプリを作ってるチンペイ(@tinpay)です
昨日も色々話題になってましたが、私からもBeaconネタをひとつ。


勤怠管理はどうされていますか?

みなさん、どうされていますか?

勤怠システムを導入してきっちり分単位で会社で管理されているところが多いかもしれません。


私はそこまできっちりじゃない、しかも自動で記録してくれるような自分専用のオレオレ勤怠管理をやりいたいなーって。
そう思ったわけです。



オレオレ勤怠管理

面倒くさがりな私。
オフィスに到着した時にわざわざアプリを立ち上げて、出勤ボタンとか退勤ボタンとか押したくないんです。 面倒くさがり屋なので。

会社に来る →  勝手にマイチャットに投稿

会社を出る → 勝手にマイチャットに投稿


こんな感じがいいなと。
マイチャット(自分専用のチャット)を確認したらだいたいの出退勤時間はわかりますよね。


image

出社のときはこんな感じで自動投稿したいです

Beaconを使って領域観測

まず、オフィスに着いた時、到着したことをiPhoneが感知する必要があります。

そこで使うのがBeacon端末です。

Beaconを机の上とかに置いておくと、Beaconに近づいたときにiPhone側が反応して、すごく短い時間ですがいろんな処理を行うことができます。

領域の範囲は環境にもよりますが、10mぐらいです。

材料

準備するものは3つ

  1. チャットワークアカウント(tokenの発行が必要)
  2. Beacon
  3. オレオレ勤怠管理アプリがはいってるiPhone

作り方

1.チャットワークのアカウントを準備します

まずはチャットワークのアカウントを準備します。


チャットワーク(ChatWork) | ビジネスが加速するクラウド会議室

↑↑アカウント取得はこちらから!

ChatWorkAPIを利用できるように申請する必要があります。 申請の方はこちらからどうぞ。

2.Beaconを準備します

今回私が使用したBeacon端末はこちらです。


MyBeacon® Pro 汎用型 MB004 Ac | 株式会社アプリックス
MyBeacon Pro

3.オレオレ勤怠管理アプリをいれます

Beacon端末に近づくとチャットワークのマイチャットへ投稿するアプリをざっくり作りました。

ソースはこちら。 tinpay/BeaconAttendanceManagement

UUID、ChatWorkAPI tokenを設定してください。

では、ポイント部分だけをざっくり説明します。

・Beacon領域の入出を検知するため、領域(リージョン)のモニタリングを開始します。


self.region = CLBeaconRegion(proximityUUID:proximityUUID,
                                 identifier:"com.chatwork.OreKin")
self.manager.startMonitoringForRegion(self.region)

・Beacon検知にはCoreLocationを使っています。現在地検知の認証を行います。


switch CLLocationManager.authorizationStatus() {
    case .Authorized, .AuthorizedWhenInUse:
        self.manager.startRangingBeaconsInRegion(self.region)
    case .NotDetermined:
        if(self.manager.respondsToSelector("requestAlwaysAuthorization")) {
            self.manager.requestAlwaysAuthorization()
        }else{
            self.manager.startRangingBeaconsInRegion(self.region)
        }
    case .Restricted, .Denied:
        break
    default:
        break
}

・Beaconの領域に出入りするときに呼ばれるメソッドがこちら。 出入りのタイミングでチャットルームにメッセージを投稿しています。


func locationManager(manager: CLLocationManager!,
        didEnterRegion 
        region: CLRegion!) {
    self.startRangingBeaconsforRegion(region)
    self.postChatWorkToMyChat("出勤しました(F)")
}

func locationManager(manager: CLLocationManager!,
        didExitRegion 
        region: CLRegion!) {
    manage.stopRangingBeaconsInRegion(region as CLBeaconRegion)       
self.postChatWorkToMyChat("退勤しました(beer)") }

・Beaconからの距離によって処理をすることもできます。 今回は画面のUILabelの色を変更しています。


func locationManager(manager: CLLocationManager!,
        didRangeBeacons 
        beacons: NSArray!, inRegion 
        region: CLBeaconRegion!) {
    println(beacons)

    if(beacons.count == 0) {
        return
    }
    //一つ目
    var beacon = beacons[0] as CLBeacon

    switch (beacon.proximity){
    case .Unknown:
        self.beaconDistance = BeaconDistance.Unknown
    case .Immediate:
        self.beaconDistance = BeaconDistance.Immediate
    case .Near:
        self.beaconDistance = BeaconDistance.Near
    case .Far:
        self.beaconDistance = BeaconDistance.Far
    }

    self.changeScreenColor()

}

以上で完成です!

実際に出退勤するとこんな感じになります。


image

何と言っても便利なのは、アプリを起動しておく必要が一切ないこと!

バックグラウンドでアプリを実行しておく必要もありません。完全にアプリを終了させてもBeaconがアプリを呼び起こして処理を実行してくれます。


さいごに

トイレいったりコンビニいったりした時でも「退勤しました!」となるので、グループチャットはオススメしません。オレオレなので。
自分だけに見える「マイチャット」に投稿しましょう。

あと、先日公開されたチャットワーク メッセージAPIを利用すると、

出社しました!
      ↓
今日も1日頑張ってね(自動応答)

という素敵なbotも作れるので、是非作ってみてくださいね(´・ω・`)