BLEUnlock

Lock/unlock your Mac with your iPhone, Apple Watch, or any other Bluetooth LE devices

2757
166
Swift

BLEUnlock

CI
Github All Releases
Buy me a coffee

BLEUnlockはiPhone, Apple Watchやその他のBluetooth Low Energyデバイスの距離によってMacをロック・アンロックする小さなメニューバーユーティリティーです。

特徴

  • iPhoneアプリは必要ありません
  • 定期的に信号を送出するBLEデバイスなら何でも使えます (静的なMACアドレスである必要があります)
  • BLEデバイスがMacの近くにあればMacのロック画面を自動的に解除します
  • BLEデバイスがMacから離れると画面をロックします
  • ロック・アンロック時にスクリプトを実行することができます
  • BLEデバイスがMacに近づくと画面スリープを解除することができます
  • BLEデバイスがMacから離れる/近づくと音楽や動画の再生を一時停止/再生することができます
  • パスワードはキーチェーンに安全に保管されます

必要なもの

  • Bluetooth Low EnergyをサポートするMac
  • macOS 10.13 (High Sierra) 以上
  • iPhone 5s以上, Apple Watch (すべて), または定期的に信号を静的なMACアドレスから送信するBLEデバイス

インストール

Homebrew Caskを使う方法

$ brew install bleunlock

手動でインストールする方法

Releasesからzipファイルをダウンロードし、解凍してアプリケーションフォルダに移動します。

セットアップ

初回起動時、以下の許可を要求します。適切に許可してください。

許可 説明
Bluetooth 当然ながら、Bluetoothへのアクセスが必要です。
アクセシビリティ ロック画面を解除するために必要です。システム環境設定の画面で左下のロックアイコンをクリックしてアンロックし、BLEUnlockをオンにしてください。
キーチェイン (要求されない場合もあります) 要求された場合、必ず常に許可を選んでください。ロック中に必要になるためです。
通知 (任意) BLEUnlockはロック中に通知メッセージを表示します。正しく動作しているか確認するのに役立ちます。Big Sur以降、デフォルトでロック画面ではメッセージが表示されません。メッセージを表示するには通知環境設定パネルでプレビューを表示常にに設定してください。

| 必要になる許可はmacOSのバージョンが上がるにつれ増えています。古いmacOSをお使いの場合は上に挙げた許可が表示されない場合があります。

次にあなたのログインパスワードを聞いてきます。これはロック画面を解除するために必要です。キーチェインに安全に保存されます。

最後に、メニューバーアイコンからデバイスを選択してください。近くにあるBLEデバイスのスキャンが始まります。使いたいデバイスを選べば完了です。

オプション

今すぐロック

BLEデバイスが近くにあるかどうかに関わらず、画面をロックします。BLEデバイスが一度遠ざかり、再び近づくと解除されます。席を離れる前に確実にロックするのに有効です。

アンロック信号強度

ロック解除に必要なBluetooth信号の強度です。値が大きいほどBLEデバイスがMacの近くにないとロック解除しません。無効にするを選ぶとBLEデバイスが近くにあってもロック解除をしません。

ロック信号強度

MacをロックするBluetooth信号の強度の閾値です。値が小さいほどBLEデバイスがMacから遠い時点でロックをします。無効にするを選ぶとBLEデバイスが遠くなるもしくは信号がなくなってもロックをしません。

ロックするまでの遅延

BLEデバイスが遠ざかってから実際にロックをするまでの時間です。BLEデバイスがこの時間内に再び近づくと、ロックは行われません。

無信号タイムアウト

最後に信号を受信してからロックするまでの時間です。意図せず「デバイスからの信号がありません」でロックされる場合、この値を増やしてください。

画面スリープから復帰

ロック中にBLEデバイスが近づいてきたとき、ディスプレイをスリープ画面から復帰させます。

アンロックせずに画面復帰

ディスプレイがスリープから復帰したとき(「画面スリープから復帰」による自動または手動に関わらず)、Macをアンロックしません。
これはApple WatchやTouch IDなどのよりセキュアなアンロック機構を使用したい場合に、「画面スリープから復帰」と共に使用すると素早く画面にアクセスできます。

ロック中 “再生中” を一時停止

ロック時に音楽や動画の再生を一時停止し、ロック解除時に再開します。対応しているのはApple Music, QuickTime Player, Spotifyなど、再生中ウィジェットやキーボードの⏯キーで制御できるアプリです。

スクリーンセーバーでロック

ロック時にスクリーンセーバーを起動します。このオプションが正しく動作するには、セキュリティとプライバシーシステム環境パネルでスリープとスクリーンセーバーの解除にパスワードを要求すぐにに設定する必要があります。

ロック時画面をスリープ

ロック時にロック画面を表示せずディスプレイをスリープします。

パスワードを設定…

Macのログインパスワードを変更したときに、このオプションを使って変更してください。

パッシブモード

デフォルトでBLEUnlockはBLEデバイスに接続を確立し信号強度を読み取ろうとします。これはサポートされているデバイスでは最も安定して信号強度を読み取ることができる方法です。しかしながら、キーボード、マウス、トラックパッドや特にインターネット共有など、他のBluetooth機器を使用している場合、このモードが干渉することがあります。2.4GHz帯のWiFiも干渉する可能性があります。Bluetoothが不安定になる場合は、パッシブモードを有効にしてください。

最小RSSIを設定

このRSSI未満のデバイスはデバイススキャンリストに表示されません。

トラブルシューティング

デバイスがリストに表示されない

Apple製以外のBLEデバイスでは、BLEUnlockはデバイスの名前を取得できない場合があります。その場合、デバイスはUUID(ハイフンで区切られた長い16進数)で表示されます。

デバイスを識別するには、Macから遠ざけたり近づけたりして、信号強度(dB値)がそれに応じて変化するかどうかを確認してください。

もしリストに何も表示されない場合、下記のBluetoothモジュールのリセットを試してください。

アンロックされない

システム環境設定 > セキュリティとプライバシー > アクセシビリティ でBLEUnlockがオンになっているか確認してください。すでにオンになっている場合、一度オフにしてもう一度オンにしてみてください。

もしキーチェインの許可を求められた場合、常に許可を選択してください。ロック中に必要になるためです。

“デバイスからの信号がありません” が頻繁に発生する場合

無信号タイムアウトを大きくしてください。それでも解決しない場合、パッシブモードを試してください。

Bluetoothキーボード、マウス、インターネット共有その他Bluetoothがおかしくなった

メニューバーもしくはコントロールセンターにあるBluetoothアイコンをShift+Option+クリックし、表示されるBluetoothモジュールのリセットをしてみてください。

macOS 12 Montereyでは、上記のオプションはなくなっています。
代わりに、ターミナルで以下のコマンドを入力してBluetoothモジュールをリセットしてください。

sudo pkill bluetoothd

このコマンドは、ログインパスワードを要求します。

それでも問題が繰り返し起こる場合、パッシブモードをオンにしてください。

MACアドレスについて

クラシックBluetoothと違い、Bluetooth Low EnergyデバイスはプライベートMACアドレスを使うことができます。プライベートアドレスはランダムで、時間が経つと変わることがあります。

最近のスマートデバイスは、iOSとAndroidともに、15分ほどで変わるランダムアドレスを使う傾向にあります。おそらくトラッキング防止のためだと思われます。

一方で、BLEUnlockは、BLEデバイスをトラッキングするために、MACアドレスは静的である必要があります。

幸運なことに、Appleのデバイスでは、Macと同じApple IDでサインインしていれば、真の(パブリック)MACアドレスが取得できます。

Android等、その他のデバイスに関しては、今のところMACアドレスを解決する方法は分かりません。非Apple製デバイスでMACアドレスが時間が経つと変わる場合、残念ながらBLEUnlockはサポートできません。

MACアドレスが正しく解決されているかチェックするには、デバイスのリストに表示されるMACアドレスと、BLEデバイスのアドレスを比較してください。

ロック・アンロック時にスクリプトを実行する

BLEUnlockはロック・アンロック時に以下のスクリプトを実行します。

~/Library/Application Scripts/jp.sone.BLEUnlock/event

スクリプトにはイベントに応じて以下の引数の一つが渡されます。

Event Argument
信号強度のためBLEUnlockによりロックされた away
無信号のためBLEUnlockによりロックされた lost
BLEUnlockによりアンロックされた unlocked
手動でアンロックされた intruded

注意: intruded イベントが正常に働くには、システム環境設定の セキュリティとプライバシースリープとスクリーンセーバの解除にパスワードを要求すぐに に設定してください。

サンプル

例としてLINE Notifyにメッセージを送るスクリプトを示します。
手動でアンロックされた場合Macの前にいる人の写真を添付します。

#!/bin/bash

set -eo pipefail

LINE_TOKEN=xxxxx

notify() {
    local message=$1
    local image=$2
    if [ "$image" ]; then
        img_arg="-F imageFile=@$image"
    else
        img_arg=""
    fi
    curl -X POST -H "Authorization: Bearer $LINE_TOKEN" -F "message=$message" \
        $img_arg https://notify-api.line.me/api/notify
}

capture() {
    open -Wa SnapshotUnlocker
    ls -t /tmp/unlock-*.jpg | head -1
}

case $1 in
    away)
        notify "$(hostname -s) is locked by BLEUnlock because iPhone is away."
        ;;
    lost)
        notify "$(hostname -s) is locked by BLEUnlock because signal is lost."
        ;;
    unlocked)
        #notify "$(hostname -s) is unlocked by BLEUnlock."
        ;;
    intruded)
        notify "$(hostname -s) is manually unlocked." $(capture)
        ;;
esac

SnapshotUnlocker はスクリプトエディタで作った .app で、内容は以下のとおりです。

do shell script "/usr/local/bin/ffmpeg -f avfoundation -r 30 -i 0 -frames:v 1 -y /tmp/unlock-$(date +%Y%m%d_%H%M%S).jpg"

このappはBLEUnlockにカメラのパーミッションがないため必要となります。このappにパーミッションを与えることによりパーミッションの問題を回避できます。

FUNDING

Apple Developer Programの年間費用は、寄付金で賄われています。

もしこのアプリを気に入っていただけたら、継続できるよう、Buy Me a Coffee もしくは PayPal.Me で寄付をしていただけるとありがたいです。

クレジット

  • peiit: 中国語のローカリゼーション
  • wenmin-wu: 最小RSSIと移動平均
  • stephengroat: CI
  • joeyhoer: Homebrew Cask
  • Skyearn: Big Surスタイルのアイコン
  • cyberclaus: ドイツ語, スウェーデン語, ノルウェー語 (Bokmål) およびデンマーク語のローカリゼーション
  • alonewolfx2: トルコ語のローカリゼーション
  • wernjie: アンロックせずに画面復帰

アイコンはmaterialdesignicons.comからダウンロードしたSVGファイルをもとにしています。これらはGoogleによってデザインされApache License version 2.0でライセンスされています。

ライセンス

MIT

Copyright © 2019-2022 Takeshi Sone.