Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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の公式クライアントについて

mito_log
ベトナム・ハノイ拠点の個人デベロッパ。東南アジア向けに素敵なサービスと文化を作るべく模索中。ベトナムで1年半農業。newbie skateboarder、ハノイITもくもく会毎週土曜朝9時頃 → https://bit.ly/2Oe9Ehk
http://mitolab.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした