Macbook을 외부 모니터에 연결할 때마다 자동으로 스크립트를 실행하도록하는 방법이 있습니까?

Aug 18 2020

내 맥북을 특정 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 객체가 살아 있어야하므로 앱의 인스턴스를 항상 열거 나 최소화해야합니다 (누군가 이것을 피하는 방법에 대한 아이디어가 있습니까?). 알림을받을 때마다 연결된 디스플레이 수를 확인하고, 디스플레이가 하나만 연결되어 있으면 내 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

그리고 이것이 앱의 모습입니다 😂

이것은 프로그래밍 방식으로 Wi-Fi에 연결하는 데 도움 이 되었습니다.