Mac mini에서 iPad를 메인 모니터로 쓰는 방법
배경
- Mac Mini M1, MacOS Sequoia 15.5
- iPad Air 4th, iPadOS 18.5 (22F76)
mac mini m1을 중고로 구입했다.
(맥북에어를 구입하고 싶었으나 아직 맥북이 필수가 아니라서, 나중에 꼭 필요할 때 최소사양 16gb, 512gb로 맞출 것이다.
mac mini m1을 고른 가장 큰 이유는 예산이다. 맥북에어 m1-8gb-256gb 중고가 55~65만원, mac mini m1-8gb-512gb 모델이 35만원.)
ios 어플리케이션 빌드용으로 구입했고 겸사겸사 홈서버용으로 사용하려고 한다.
예산 때문에 포기한 맥북이 눈 앞에 아른거렸다. 맥미니를 노트북처럼 사용하고 싶은 욕구가 솟구쳤다.
도서관에서 노트북으로 작업할 때가 있는데, 오래된 노트북이라 무겁고 팬소음이 우렁차서 눈치가 많이 보였다.
(19년도에 구입한 아수스 게이밍노트북+충전기 조합이 3kg가 넘는다)
기존에 아이패드 에어 4세대를 가지고 있어서 아이패드를 맥미니의 주모니터로 사용하면 될 것 같았다.
요구사항은 4가지였다.
1. 휴대성이 보장되어야한다. 어떤 새로운 환경에서든 주모니터로서 아이패드를 맥미니에 연결할 수 있어야 한다.
2. 오프라인으로도 연결 가능해야한다.
3. 주모니터로 사용할 수 있을만큼은 사용자 경험이 좋아야한다.
여러가지 방법이 존재했다. 여러 시도 끝에 성공했고, SideCar를 이용한 방법을 중점적으로 소개할 것이다.
가볍게 상용 어플 중 하나인 yam display를 리뷰하고, 왜 SideCar 우회 방법으로 전환했는지 소개하겠다.
(참고로, 앞으로 소개할 SideCar 우회 방법은 직접 시도하진 않았지만, 맥 미니 m4 + iPad Mini 조합에서도 가능할 것으로 보인다.)
목차
1. "yam display" 어플 리뷰.
2. 애플의 SideCar 기능 우회 방법 소개.
< yam display >
duet, yam display 등 아이패드를 주모니터로 사용할 수 있게 해주는 어플들이 있다.
무료 어플을 포함해서 많은 어플이 있지만 반 유료어플인 yam display를 사용해봤다.
장단점을 먼저 정리하자.
장점:
- 화면 터치를 같이 사용할 수 있다.
- 화면분할이 지원되어서, 한 쪽에는 모니터를 다른 쪽에는 메모장 등의 아이패드 어플과 함께 사용가능하다.
(메모장에서 애플펜슬로 그림그리고, 애플의 handoff 기능을 이용해서 맥미니에 그림을 복붙할 수 있다. Good) - 유료 11000원이다. 싸다.
- 첫 연결이 어렵지 않다. 조금만 찾아보면 금방 아이패드를 연결할 수 있다.
단점:
- 해상도가 낮다.
높은 해상도를 요구하는 작업을 안 한다면 괜찮을 수도 있다. - 해상도를 높이면, 반응속도가 느려지고 아이콘 등의 글자들이 너무 작아져서 사실상 사용하기 어렵다.
(신호등의 닫기 버튼등을 누를 때 바늘에 실넣기처럼 힘들다.) - 무료버전은 연속으로 7분정도만 사용가능하다. 7분이 지나면 다시 연결해줘야 한다.
(연결 자체는 어렵지 않다. 버튼 한 번 딸깍으로 연결가능해서 7분 간격으로 누를 각오가 있다면 무료버전 사용하면 된다.) - 화면 터치가 잘 안 되는 경우가 있다. 작은 버튼은 터치보단 마우스로 클릭하는게 낫다.
(손가락으로 줌해서 버튼을 터치할 수도 있지만, 매우 귀찮다.)
총평:
터치를 지원해준다는건 매우 좋지만, 모니터로서의 역할로는 좀 부족하다.
해상도를 적당히 낮춰도, 아이패드에 최적화된 해상도는 없기에 사용자 경험이 떨어진다.
아이콘이 너무 작거나 커서 모니터로 사용하기에는 불편하다.
사용자 경험측면에서(3번째 요구사항) 약간의 불만족이 있었다.
< SideCar 우회하기 >
애플에서 공식지원하는 세컨 모니터 기능, sidecar는 아이패드에 최적화된 해상도를 제공해주므로써 실제 세컨 모니터의 역할을 할 수 있다. 장단점부터 정리해보자.
장점:
- 공식적으로 애플에서 제공하는 기능이기 때문에 따로 어플을 설치하지 않아서 연결이 편하고, 보안 걱정이 없다.
- 사용자 경험이 높다. 아이패드에 최적화된 해상도를 지원해서 세컨 모니터로서 충실하다.
단점:
- 사이드카 기능은 공식적으로 세컨 모니터가 목적이라서, 우회 없이 주모니터로서 사용할 수 없다.
- 터치가 제한적이다.
두 손가락으로 위 아래 휠 기능과 줌기능 정도만 가능하다. 터치를 통한 클릭은 애플펜슬을 사용해야한다.
(주로 마우스를 사용할 것이기에 큰 단점은 아니다.) - 사이드카 기능을 우회하여 주모니터로 사용하려면 세팅과정이 꽤나 험난하다.
- MacOS가 업데이트 될 때마다 개인적으로 따로 우회 방법을 유지보수해야할 수도 있다.
내가 찾은 우회 방법 특징:
소개할 우회 방법의 가장 큰 특징은 두 가지다.
1. 더미 HDMI를 살 필요 없다.
2. 와이파이에 연결되어 있지 않아도 유선으로 세팅 가능하다.
기존의 방법들을 찾아보니, 더미 hdmi를 이용하는 방법, hdmi 캡처 카드를 구매하는 방법, http 요청을 통한 SideCar 자동연결 등의 방법으로 SideCar를 우회했다. 하지만 각각 단점이 있었고, 내 요구사항에 맞는 방법을 찾았다.
내가 찾은 방법은 아래와 같다.
다양한 모니터 기능을 지원하는 BetterDisplay를 이용하여 가상모니터를 만든다.
macOS 기본 프로그램인 apple script, automator을 통해 SideCar 연결을 자동화하고,
혹시 모를 SideCar 연결 해제 상황을 대비하여 keyboard shortcut에서 단축키를 지정한다.
( 최대한 외부 프로그램을 사용하지 않으려고 노력했다.)
SideCar 우회 세팅 방법: (글작성중...)
1. BetterDisplay를 이용해서 virtual display를 추가한다.
- 14일 간의 무료 기간이 있다. 유료는 3만원대.
- 내용 추가 예정.
2. Apple Script 작성
챗지피티의 도움을 받아서 코드를 작성했다. 돌아는 가지만, 아직 최적화된 코드는 아니라서 수정이 필요하다.
코드를 보면 알겠지만 코드 사이사이에 delay가 많다. 그래서 코드 실행되는데, 경우에 따라 30초 이상 필요하다.
간단하게 코드를 설명하자면 아래와 같다.
- 맥미니가 사용자 로그인되고, 아래 script가 실행되면 5초의 여유를 준다.
- 시스템 설정 화면을 불러오고 화면이 불러와졌는지 0.2초 간격으로 체크하는 무한 반복문을 돌린다.
- iPad가 유선usb로 연결되었는지 확인하기 위해 usb 포트 정보를 불러오고 "iPad" 글자가 포함되었는지 체크한다.
- iPad가 유선으로 연결되어 있지 않으면 3초 기다리고 다시 정보를 확인한다. 이 과정을 최대 100번까지만 반복한다. 즉, 300초내로 iPad 연결이 확인되지 않으면 결국 오류가 발생할 것이다. -> (아직 오류 처리 코드를 넣지 않음.)
- iPad 연결이 확인되면 시스템 설정 - 디스플레이 메뉴를 클릭하고,
- 연결되어 있는 모니터(가상 모니터)에 sideCar를 추가하기 위한 버튼을 클릭한다.
- 대략적인 계산을 통해 sideCar 활성화 버튼이 클릭된다.
이때, virtual 모니터 설정 항목에서 "고급- Mac 또는 iPad에 연결 - 포인터 및 키보드가 근처의 Mac 또는 iPad 간에 이동하도록 허용" 을 비활성화해두는 것이 좋다. 활성화되어 있으면 SideCar 활성화 버튼을 클릭 후 나타나는 드롭다운 메뉴에 키보드 및 마우스를 연결하는 항목이 추가되어서 SideCar 활성화 버튼이 아닌 엉뚱한 게 클릭된다. - 문제가 없다면 스크립트 실행 후 대략 20초내로 SideCar가 활성화된다.
-- "가상디스플레이- 고급- Mac 또는 iPad에 연결 - 포인터 및 키보드가 근처의 Mac 또는 iPad 간에 이동하도록 허용 비활성화"
delay 5
tell application "System Settings"
activate
end tell
delay 2
tell application "System Events"
tell process "System Settings"
-- 창이 뜰 때까지 대기
repeat until exists window 1
delay 0.5
end repeat
-- Check iPad connected
set maxRepeats to 100 -- The script will terminate after 300 seconds.
set currentRepeat to 0
set iPadConnected to false
repeat until iPadConnected or currentRepeat is equal to maxRepeats
set usbDevices to do shell script "system_profiler SPUSBDataType"
if usbDevices contains "iPad" then
log "The iPad is connected. "
set iPadConnected to true
delay 1
else
log "The iPad is not connected."
set currentRepeat to currentRepeat + 1
delay 3
end if
end repeat
-- move to "display" session
click menu item "디스플레이" of menu "보기" of menu bar 1
delay 1
set g1 to first group of window 1
set g2 to first UI element of g1
set g3 to second group of g2
set g4 to first group of g3
set popUpButton to first pop up button of g4
click popUpButton
delay 2
set popUpButtonPosition to position of popUpButton
set popUpButtonSize to size of popUpButton
set x to item 1 of popUpButtonPosition
set y to item 2 of popUpButtonPosition
set w to item 1 of popUpButtonSize
set h to item 2 of popUpButtonSize
log "popUpButton Position: " & (x as string) & ", " & (y as string)
log "popUpButton Size: " & (w as string) & ", " & (h as string)
-- calculate center position of side-car-popup-button
-- 계산식 적용: a = w*1.5 + x, b=h* 2.5 +y
-- AppleScript는 부동소수점 계산을 할 때 명시적으로 real 타입을 사용해야 오류를 줄일 수 있습니다.
set raw_center_x to (w as real) * 1.5 + (x as real)
set raw_center_y to (h as real) * 3.2 + (y as real)
-- Rounding down a floating-point result to an integer.
set center_x to round raw_center_x rounding down
set center_y to round raw_center_y rounding down
set sideCarPopUpButtonCenterPosition to {center_x, center_y}
log "Calculated sideCar-PopUpButton-Center-Position: " & (center_x as string) & ", " & (center_y as string)
tell application "System Events"
delay 1
click at sideCarPopUpButtonCenterPosition
end tell
delay 1
--클래스 확인
--log "g4의 클래스: " & (class of newElements as string)
--repeat with el in newElements
-- try
-- log "Class: " & (class of el as string) & ", Role: " & (role of el as string) & ", Name: " & (name of el as string)
-- end try
--end repeat
end tell
end tell
3. script 내보내기.
.app 확장자로 실행파일을 만든다.
script는 기본 .script 확장자로 저장되는데, "파일-내보내기"를 통해 .app 확장자로 실행가능한 파일인 .app 확장자로 만들 수 있다.
4. 앱에 권한 부여
- 실행하기 위한 손쉬운 사용 제어 권한을 준다.
해당 파일을 더블클릭해서 실행하면, 권한 요청 팝업이 뜬다. 수락하면 시스템 설정 - 개인정보 보호 및 보안 - 손쉬운 사용화면을 띄워주면서 손쉬운 사용 목록에 해당 app이 자동 추가된 것을 볼 수 있다. 활성화만 시켜주면된다. - 다시 app을 실행시키고자하면, 이번에는 system event 권한을 요청한다. 수락.
system event 권한이 정상적으로 부여되면, 해당 앱은 "시스템 설정 - 개인정보 보호 및 보안 - 자동화"에서 자동화 목록에 추가되어있다. 자동화 항목에 앱이 추가되지 않았다면 앱 실행시 system event권한이 없다는 -25211 에러를 마주칠 것이고, 이 에러가 발생하면 apple script 만들기부터 다시 시작하는게 좋다.(내보내기 뿐만 아니라 새로운 스크립트 문서에 코드를 복사해서 다시 만들어야한다.)
애플 앱에는 권한을 관리하는 식별 기능이 있다. 식별자를 통해 앱에 권한 요청했던 기록이 남고, 사용자가 첫 차례에 권한을 부여를 거절하면 매번 권한 요청하는 과정을 생략하고, 바로 에러 팝업을 띄운다. 그래서 처음에 권한이 제대로 부여되지 않으면 수동으로 권한을 부여해야한다. 그러나 system event 권한을 수동으로 부여하긴 어렵다. 관련 자료를 찾을 수 없었고, 챗지피티도 그냥 식별자를 초기화하거나 스크립트를 다시 작성해서 새롭게 app을 만들 것을 추천했다.
system event 에러 팝업 내용.
시스템설정-{앱} 에 보조 접근이 허용되지 않습니다.
System Events에 오류 발생: 시스템설정-sidecar에 보조 접근이 허용되지 않습니다.(-25211)
5. 앱 실행
권한 문제만 잘 해결된다면 80%는 끝났다. 앱을 실행시키고 잘 작동하는지 확인하자.
6. 앱을 시작 프로그램에 추가하기
맥미니가 부팅되고, 로그인되면 자동 앱이 시작하도록 앱을 시작 프로그램에 추가한다.
"시스템 설정 - 일반 - 로그인 항목 및 확장 프로그램"에서 로그인 시 열기에 '+' 버튼을 눌러 앱을 추가해준다.
7. 단축키 설정을 위한 automator로 "서비스"추가.
부팅은 되었지만, 버그로 인해 앱이 자동실행되지 않거나, 중단될 수도 있다.
이런 경우를 대비해서 단축키를 지정하여 앱이 다시 실행될 수 있도록 하자.
- automator를 실행시키고 새로운 문서 선택 - 빠른 동작을 선택한다.
- 작업 흐름 수신은 "입력 없음", 선택 항목 위치는 "모든 응용 프로그램"으로 지정해준다.
- 왼쪽에 동작 이름 검색에서 "응용 프로그램 실행"을 찾고, 오른쪽 작업흐름 공간으로 드래그앤드롭한다.
- 파일- 내보내기에서 이름만 바꿔주고 내보낼 위치만 지정해준뒤 내보낸다.
- 내보낸 폴더로 가서 .workflow 확장자 파일을 실행시켜주면, 빠른 동작 설치를 묻는다. 설치 클릭.
"서비스"에 추가되었다는 메시지를 받는다.
8. 단축키 설정
"시스템 설정 - 키보드 - 키보드 단축키 - 서비스 - 일반"에서 해당 서비스를 찾아서 오른쪽의 단축키를 지정해주자. 임의로 ctrl + shift + s로 지정했다.
25.06.22 작성 기준 script v1.0.0
- 밖에서 테스트 안 해봄. 방구석 테스트라서 문제 있을 수 있음.
- 시간 최적화 필요. 현재 30초 이상 걸리기도 함.
- 맥미니 부팅 후 로그인 시 화면이 꺼진 상태에서 비밀번호 입력해서 로그인해야함. (로그인을 끄려면 FileVault 보안 기능을 비활성화해야하는데, 싫음.)
- 시작 프로그램으로 앱이 실행되지만 가끔 실행되지 않아서 단축키로 실행시키고 있음.