Macbook을 외부 모니터에 연결할 때마다 자동으로 스크립트를 실행하도록하는 방법이 있습니까?
내 맥북을 특정 Wi-Fi에 자동으로 연결하고 외부 모니터에 연결할 때마다 Lunar를 실행 하고 플러그를 뽑을 때 그 반대의 경우도 마찬가지지만 어디서부터 시작해야할지 모르겠습니다.
예를 들어 60 초마다 외부 모니터가 연결되어 있는지 확인하는 스크립트를 작성할 수 있지만 이벤트가 발생할 때까지 아무것도 확인하지 않고 아무것도하지 않는 "이벤트 기반"과 같은 작업을하고 싶습니다. 외부 모니터 연결됨 "또는"외부 모니터 연결 해제 됨 ")이 발생합니다.
힌트가 있습니까?
답변
2 Daniel
아무도 대답하지 않았고 여전히 더 간단한 솔루션을 찾고 있지만 작은 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에 연결하는 데 도움 이 되었습니다.