MacBookを外部モニターに接続するたびにスクリプトを自動的に実行する方法はありますか?

Aug 18 2020

MacBookを特定のWi-Fiに自動的に接続し、外部モニターに接続するたびにLunarを起動したいのですが、プラグを抜くとその逆になりますが、どこから始めればよいのかわかりません...

たとえば、60秒ごとに外部モニターが接続されているかどうかをチェックし続けるスクリプトを書くことはできますが、イベントまでチェックも何もしない「イベントドリブン」のようなことをしたいと思います(」 「外部モニターが接続されています」または「外部モニターが接続されていません」)が発生します。

ヒントはありますか?

回答

2 Daniel Aug 23 2020 at 14:08

誰も答えず、私はまだもっと簡単な解決策を探していますが、小さなSwiftUIアプリを作成する回避策を見つけました。

//
//  ContentView.swift
//  HomeSweetHome
//
//  Created by Daniel Falbo on 20/08/2020.
//  Copyright © 2020 Daniel Falbo. All rights reserved.
//

import SwiftUI

struct ContentView: View {
    
    func execute(script: String) {
        let task = Process()
        task.launchPath = "/usr/bin/env"
        task.arguments = ["/Applications/HomeSweetHome.app/Contents/bin/\(script)"]
        task.launch()
    }
    
    var body: some View {
        Text("🏡")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .onReceive(NotificationCenter.default.publisher(for: NSApplication.didChangeScreenParametersNotification)) { _ in
                self.execute(script: NSScreen.screens.count > 1 ? "connect" : "disconnect")
        }
    }
    
}

基本的には、didChangeScreenParametersNotificationをリッスンする単なるTextオブジェクトです。通知をリッスンするにはTextオブジェクトが生きている必要があるため、アプリのインスタンスを常に開くか最小化する必要があります(これを回避する方法について誰かが考えていますか?)。通知を受信するたびに、接続されているディスプレイの数を確認します。接続されているディスプレイが1つしかない場合disconnectは、connectスクリプトを実行します。それ以外の場合は、スクリプトを実行します。

スクリプトは次のようになります。

#!/usr/bin/env sh
#
# connect
#
open -a Lunar
networksetup -setairportnetwork en0 $SSID $PASSWORD
#!/usr/bin/env sh
#
# disconnect
#
killall Lunar
networksetup -setairportnetwork en0 $SSID $PASSWORD

そして、これはアプリがどのように見えるかです😂

これは私がプログラムでwifiに接続するのに役立ちました