家中的Mac Mini作为服务器没有单独连接显示器。需要连接桌面时需要使用远程桌面。Mac自带的远程桌面体验尚可,但是iPad就只能使用VNC客户端了。不仅传输质量不如Mac自带的远程桌面,而且还需要每次连接在锁屏界面再输入一次密码。并且经常出现在锁屏界面转圈的Bug。恰好M4芯片的iPad Pro到手了,于是花了几天时间研究如何使用iPad一键随航Mac Mini。

首先要说明的是,随航功能是无法使用手指触屏操作的。需要一支Apple Pencil或者外接键鼠/触摸板连接至Mac Mini才能操作随航的系统界面。

自动点击随航按钮的AppleScript

AppleScript 是由 Apple 开发的一种编程语言,主要用于在 macOS 上进行任务自动化。它允许用户编写脚本来控制访达、Safari、设置等系统自带应用程序以及很多第三方应用程序。

我们使用AppleScript来进入系统设置-显示,并且点击加号按钮来模拟手动进入随航的行为。

这些AppleScript参考了博客园的coreylinB站的我是一只草鱼。我将coreylin的代码迁移到英文系统中,并修复了一些可能导致失败的地方。使用快捷指令运行AppleScript的方法则是来自我是一只草鱼。由于我的代码针对英文系统,如果需要中文的脚本可以参考coreylin的代码,将对应部分改为中文。

on findLastTargetIndex(targetItem, itemList)
	set lastIndex to 0
	repeat with i from (count of itemList) to 1 by -1
		if item i of itemList is targetItem then
			set lastIndex to i
			exit repeat
		end if
	end repeat
	return lastIndex
end findLastTargetIndex

beep 1
beep 1

tell application "System Settings"
	activate
	delay 1
	tell application "System Events"
		tell process "System Settings"
			click menu item "Displays" of menu "View" of menu bar item "View" of menu bar 1
			delay 0.3
			tell group 1 of group 2 of splitter group 1 of group 1 of window "Displays"
				try
					delay 1
					-- 这里需要延迟,因为系统设置冷启动后不能立刻加载出右侧的界面
					click pop up button "Add"
					-- 获取所有菜单项的名称					
					set menuItems to name of menu items of menu "Add" of pop up button "Add"
					-- 通过名字查找要准确一些,这里去找最后一个名字的索引,因为如果符合通用控制的调节,就会出现两个名字,一个是通用控制,一个是随航
					set targetIndex to (my findLastTargetIndex("花旗书砚台", menuItems))
					-- 点击目标菜单项
					delay 0.3
					click menu item targetIndex of menu "Add" of pop up button "Add"
					say "sidecar connected"
				on error
					delay 0.5
					say "Not found"
				end try
			end tell
		end tell
	end tell
end tell
delay 1
beep 1

--tell application "System Settings" to quit

有了这个脚本,就可以打开macOS中的脚本编辑器来测试运行了。注意将其中的设备名"花旗书砚台"改为自己的iPad名称。注意,英文系统中iPad默认的设备名"Bob's iPad"中的撇并非一般的撇。这种情况建议修改默认设备名,或者复制设备名到脚本中,不要使用键盘打出来。在测试运行的过程中,程序可能会索取多种权限,全部授予即可。

添加虚拟显示器

完成以上操作,Mac至少连接了一台显示器或一个远程桌面。但是,Mac在没有显示器的情况下是无法随航的。这时候就需要一个虚拟显示器。

使用虚拟显示器非常简单,只需要下载BetterDisplay,然后在软件中添加即可。由于本篇文章的贡献主要是AppleScript,这里不做过多赘述。

利用快捷指令一键启动随航

上面的脚本仅仅能够模拟点击。但我们需要一个方法能够触发上面的脚本。这时候就需要利用快捷指令中的执行AppleScript和远程执行SSH的指令了。

在调查网络上现有的方法之前,我没有想到快捷指令可以执行AppleScript和远程执行SSH。有了这两个工具,我想未来可以解锁更多快捷指令的文玩法。

在Mac上启动快捷指令应用并新建一个快捷指令,在右侧的框中搜索"run",即可发现有Run AppleScript选项。添加这个动作,然后将以上AppleScript粘贴到框里,即可进行测试。

测试没有问题后,可以为这个快捷指令换个图标起个名字。这里建议名字无需起太好,因为我们并不直接运行这个快捷指令。它将来需要使用SSH被触发。名字不包含空格和中文更容易书写SSH指令。这里我起名为connect_sidecar

保存快捷指令后回到主界面,右击快捷指令,选择添加到Dock栏。这一步可以将快捷指令打包成一个可以启动的App,方便以后调用。添加到Dock栏之后可以立即删除,这个App已经保存至~/Applications/目录下。

最后,我们再新建一个快捷指令。注意,这个快捷指令不是在Mac上运行的。利用iCloud可以同步至iPhone、iPad等设备上一键启动随航,未来Mac Mini不再需要单独的显示器。

在新建的快捷指令中再次搜索"run",即可发现有一个Run script over SSH的快捷指令。添加这个快捷指令。

在要执行的命令一栏,填入以下命令。注意,应用的名称根据上一步的起名变化:

cd ~/Applications
open -a 'connect_sidecar.app'

下面的信息依据实际情况填写。

接下来,就可以设置一个好名称和好图标了。未来,在iPad上点击这个快捷指令即可一键随航至iPad。iPad至此拥有了macOS。