⌨️

複数Mac間でMagic Keyboardを共有する方法

2024/02/17に公開
3

私は、日常的に複数のMacbookを使用していますが、Apple Magic KeyboardやMagic Trackpadをスムーズに切り替えることができないという問題に直面しておりました。
この記事では、Automatorとblueutilを使用して、複数のアクセサリ(Magic Keyboardを含む)を1クリックで切り替える方法を紹介します。出来るだけ、エンジニアでなくても理解出来るように丁寧に説明していきます。

私のMacは英語設定になっておりますので、名称等が異なる可能性がございますが、ご了承下さい。

今までの対処方法

  • 有線接続する事で強制的に切り替える
  • Magic Keyboardは、片方のMacbookから手動で登録を解除する。
    (Magic Keyboardは一台にしか登録する事が出来ないため。)

事前準備

Homebrewのインストール

Homebrewが未インストールの場合、以下の記事を参考にインストールしてください。

https://qiita.com/zaburo/items/29fe23c1ceb6056109fd

blueutilのインストール

brew install blueutil

実際の手順

デバイスIDとblueutilのパス確認

デバイスIDの検索

Magic KeyboardやMagic TrackpadのデバイスIDを確認するには、以下のコマンドを実行します。

blueutil --paired

私の場合は、
Keyboard: b0-be-83-e4-2a-25
Trackpad: d4-57-63-61-53-16
をメモっておく。

blueutilのパスの確認

blueutilのパスを確認するには、以下のコマンドを実行します。

which blueutil

Automatorでのスクリプト登録

Automatorを開く

「アプリケーション」フォルダからAutomatorを開き、「新規作成」を選択します。

クイックアクションの作成

「アプリケーション」を選択し、右下の「選択」を押します。

"シェルスクリプトを実行"アクションの追加

検索から、「シェルスクリプトを実行(Run Shell Script)」を探し、ワークフローにドラッグ&ドロップ又は、ダブルクリックします。

スクリプトの貼り付け

「シェルスクリプトを実行」アクションに元々あるcatを削除し、以下のスクリプトを貼り付けた後、PathとIDを変更しましょう。

pathは、/opt/homebrew/bin/blueutilの部分。

IDは以下の部分です。
MAGIC_KEYBOARD_ID="b0:be:83:e4:2a:11"
MAGIC_TRACKPAD_ID="d4:57:63:61:53:11"

# Function to pair or unpair a device based on its connection status
pair_or_unpair_device() {
    local DEVICE_ID="$1"
    local res=$(/opt/homebrew/bin/blueutil --is-connected $DEVICE_ID)
    if [[ "$res" = '1' ]]; then
        /opt/homebrew/bin/blueutil --unpair $DEVICE_ID
    else
        /opt/homebrew/bin/blueutil --pair $DEVICE_ID
        sleep 1
        /opt/homebrew/bin/blueutil --connect $DEVICE_ID
    fi
}

# Magic Keyboard ID and Magic Trackpad ID
MAGIC_KEYBOARD_ID="b0:be:83:e4:2a:11"
MAGIC_TRACKPAD_ID="d4:57:63:61:53:11"

# Call the function with the Magic Keyboard and Trackpad IDs
pair_or_unpair_device $MAGIC_KEYBOARD_ID
pair_or_unpair_device $MAGIC_TRACKPAD_ID

keyboardのみの切り替えの場合には、以下の行を消去して下さい。
MAGIC_TRACKPAD_ID="d4:57:63:61:53:11"
pair_or_unpair_device $MAGIC_TRACKPAD_ID

保存とテスト

適切な名前をつけて"file"から、保存を選択しましょう。私は、"Accessory Switcher"と名付け、Applicationsに入れました。

セキュリティの権限の付与

Bluetoothへの以下アプリのアクセス権限を付与します。内容を変更した場合には、その都度新たに、セキュリティへ追加しないと、正常に動かないようです。
  • Terminal
  • Automator
  • Accessory Switcher(先ほど作成したAutomator)

上記のステップを切り替え先のMacでも設定して下さい。Mac毎に、登録されているアクセサリーのIDが異なる点に注意して下さい。
これで、複数のMacデバイス間でMagic KeyboardやMagic Trackpadをスムーズに切り替える準備が整いました。

試してみる

接続状況の確認(切り替え元のMac)

アクセサリーが接続されている事の確認。

"Accessory Switcher"(作成したAutomator)をクリック(切り替え元のMac)

Dockに置いて置くことや、ショートカットを割り当てても良いですね。

接続が切れている事の確認(切り替え元のMac)

作成した、Automatorをクリック(切り替え先のMac)

Track pad, Keyboardが接続されている事が確認出来ます。

エラー

Info.plist関連のエラー

コメント頂いた以下のエラーに関してトラブルシューティングしていきます。

Termination Reason:    Namespace TCC, Code 0 
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaining to the user how the app uses this data.

私はこちらのエラーは出なかったのですが、エラーで記載されている通り、Info.plistにkey, valueを追加してみましょう。

Info.plistを見つける

作成したアプリを右クリック、"show package Contents"を選択。日本語設定の方は、「パッケージの内容を表示」とかですかね?

Info.plistを開く

Info.plistがいましたね。私はVS CodeでInfo.plistを開きました。

エラーに従い、key, stringを入れる

stringは何でも良いと思いますが、周りのstringの空気を読んで、それっぽいコメントを入れておきました。
入れ終わりましたら、保存して完成。

<key>NSBluetoothAlwaysUsageDescription</key>
<string>This application requires Bluetooth access to switch between devices.</string>

検証

私はエラーが出ないので、コメント頂いたshowさんの環境で実行出来れば解決!

おわりに

今回の表題は、Magic keyboardに関してでしたが、上記の方法を使えばBluetooth接続しているアクセサリーを全て纏めて、接続、接続解除が可能です。
Automatorを使用せず、shellコマンドを実行する形でも大丈夫だったのですが、エンジニア以外の方でも簡単に出来る事を目指したので、上記の方法にしました。
より良い方法をご存知の方や、動かない等ございましたら、ご自由にコメント下さい。

本記事のような、英語でしか書かれていない情報や、日本語であまり記載されていない情報を定期的に発信していきますので、もし良ければX(Twitter)フォローお待ちしております↓
https://twitter.com/kikodevj

Discussion

showshow

コメント失礼します。
記事の通りにスクリプトを設定してAutomater で作成したアプリを起動すると、「アクション”シェルスクリプトを実行”でエラーが起きました」という警告が出ました。
システム設定で許可も出してあります。
macのコンソールでログを解析してみると以下のようなクラッシュログが見つかりました。

Termination Reason:    Namespace TCC, Code 0 
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaining to the user how the app uses this data.

何かご存知でしたら、情報をご提供頂きたいです。
お手数をお掛けしますが、よろしくお願いします。

kikokiko

お試し頂きありがとうございます。
週末確認致します!