6
7

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.

JINS MEMEAdvent Calendar 2015

Day 18

JINS MEME x socket.ioで離席時に自動でスクリーンロックをかけるやつを作ってみた

Last updated at Posted at 2015-12-18

What's JINS MEME

一言でいうと、外ではなく内を見ることのできるメガネです。詳細については以前まとめたものがありますので、そちらをご参考ください。
http://qiita.com/mito_log/items/020a87996ed2b9d793e6

Motivation

私は特定のオフィスをもっていないので、作業をするのはほぼカフェとかコワーキングスペースなどのpublicなスペースです。そこでトイレに行きたいなどの離席時に、画面を自動でロックしてくれたら1秒くらい時短できるなぁ(洒落てるなぁ)と思って今回のサンプルを作り始めました。今回もRxSwiftです。

What I created (gif movie)

autoLockScreen.gif

What will be covered

今回は2部構成の2部目の記事、という体裁にしています。各部の内容は以下:

github

https://github.com/mitolog/JINSMEMESampler
今回のサンプル部分はこちら

How it works

jinsmeme_autoscreenlck.png

仕組みとしては、

  1. iOSアプリでJINS MEME SDKを経由して取得したデータをsocket.ioクライアントを用いてnode serverに送信します
  2. node serverではiosアプリからのデータをそのままmac側に受け流します(broadcast)
  3. macアプリでは、node serverから届いたJINS MEMEデータからisWalkingパラメータを抜き出し、x歩カウントされたら、スクリーンロック

という感じです。

Recap

How to Lock Screen via mac app

"アプリからどうやって画面ロックを実行するか"を調べてみると、stackoverflowで色々とやり方が紹介されていました。その中でも一番簡単そうなNSTaskを使って、terminal(シェル)のコマンドを実行する手法を今回は採用しました。

コードとしては本当に単純で、

ViewController.swift
let task = NSTask()
task.launchPath = NSBundle.mainBundle().pathForResource("CGSession", ofType: nil)!
task.arguments = ["-suspend"]
task.launch()

これだけです。ポイントとしては、CGSessionのシンボリックリンクを作ってそれをNSBundleに入れてあげていることです。直接リンク先をlaunchPathに指定するとアクセス出来ないよとエラーになってしまうので、今回このような泥臭いやり方になりました。

$ cd path/to/project/directory
$ ln -s /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession

Some todos...

今回はあくまでサンプルということで、とりあえず動くところまでやりましたが、もし万が一アプリとして提供する場合にはまだクリアすべき課題がいくつかあります。

1. socket.ioサーバをローカルPCでデーモン化する?クラウドに置く?

これクリアしないと、毎回node appなんて打たなければいけません。そんなの面倒すぎます。

2. 離席時間が長いとsocket.io切れない?大丈夫?

各種仕様を把握していないので、確認しないと変な挙動がでそうです。ロック中にsocketはtimeoutしないかとか、iOS/macアプリがバックグラウンドにいくとどうなるとか。もろもろ。

3. 離席/着席の判定をちゃんとする

現状は、あくまでサンプルということで、離席から戻った判定をせず、macアプリ上のconnect/disconnectボタンを押すことで'着席した'ということにして、歩数カウントのリセットし、再度離席モニタリングを開始をしています。これだとただ無駄な作業が増えるだけなので、着席チェックを自然に行うには〜をもう少し詰めないといけません。

4. 右上のメニューバーに追加しておけると便利かも?

nice to haveな単なる願望です。stackoverflowとかこういうとこ見つつやってみたい。

ということで、要改善点は多いですが、JINS MEMEのある生活を少しイメージできたのではないでしょうか。

JINS MEME is very robust

私はfitbit(腕時計型万歩計)も使っているのですが、あれだと着けている部分が汗ばんできて、カフェとか目的地につくと100%と行っていいほど外しています。一方でメガネは常に身に着けているもの(ないと困る)なので、歩数だったり、姿勢だったり、眠気や瞬きなどを、ユーザが意識すること無く常にセンシングすることができます。

今回は席を離れるというアクションだけで画面を自然にロックすることができましたが、他にも姿勢が悪くなるというアクションでLED照明の色を変化させたり、上を向くというアクションだけでスクリーンを暗くしたり、そういう自然なインタフェースを実現して、より生活に溶け込んで且つ生活の質を向上させるアプリケーションを実現できるんじゃないかなーと思っています。

ただ、1点、20年来のメガネユーザー(コンタクトは3日で紛失したくらい相性が悪い)として言いたいこととしては(JINS MEME ESの場合)、柄の部分が真っ直ぐなせいで耳にfit感がなくて、下をむくとかちょっと激し目な動きをすると、落ちそうになっちゃいます。そこをどう回避したらいいかを教えてほしいです(笑)。

References

【OSX】【swift】コマンドの実行

socket.ioの公式クライアントについて

6
7
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
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?