MenuCue 的 README 里有一句话:开启系统外观切换之后,如果别的自动切换把深浅色改走了,MenuCue 会定期把 macOS 纠正回来。

这句话从9月25日起就不对了。那天的提交不再纠正了,README 没跟着改,我翻到的时候还是原样。

15秒

先说这个功能是什么。MenuCue 的外观可以按一个参考时区自动切,早上7点到晚上7点浅色,其余时间深色,也可以顺手把 macOS 系统本身的深浅色一起切掉。后一项要自动化权限,默认是关着的。

原来的写法是每隔15秒核对一遍:读系统现在是深色还是浅色,跟自己的日程一比,不一样就写回去。

毛病其实出在「不一样就写回去」上。日程只管这个点该是深色还是浅色,不知道我这会儿想要什么。别人切了,它就当是出错,又改回去。手动切一下,撑到下一次核对就没了。macOS 自己的日出切换更惨,系统日志里记着9月25日 06:43:40 切过去,06:43:48 被改了回来,隔了八秒。两套日程在每个日出和日落都抢同一个设置。

改法很短:只在该变的那一刻写一次。到了7点或19点,或者刚启动,算出来的外观翻了面,才写,之后的核对一概不碰。别人切的,就让它留着。

开关那一行也跟着改了:写明按哪个时区在跑,两边时区不一样,就把换算到这台 Mac 上的时间段列出来(提交里举的例子是参考时区 Asia/Shanghai、Mac 在 America/Los_Angeles,浅色就是16:00到04:00),外观设成跟随系统的时候干脆灰掉,因为那时候没有目标可以同步。以前这一行没写这些。

读不到

同一天的下一个提交,改的是另一半。

快捷操作里有个深色模式按钮,要知道系统现在是不是深色,原来是去问 System Events,需要的恰好是写入时用的那个自动化授权。授权被收回以后,它回答的是「不是深色」,不是「我读不到」。没权限和浅色模式,在界面上一模一样。代码里就是一个 ?? false。

写的那头也一样。系统拒绝了写入,AppleScript 的报错被丢掉,开关还亮着,什么都没发生。

现在直接读系统的全局偏好,用不着再去问谁。写被拒了就记下来,显示在开关那一行,旁边是去自动化设置的入口和一个重试,同一次拒绝也不会每次核对都重复一遍。

七月的定时器

七月底其实有过一个类似的。

唤醒记录原来靠一个每15分钟的定时器去刷。7月28日的提交把它拿掉了:启动时读一次,补上应用没开的那段,之后只在系统发出唤醒通知的时候读。后台监控开着、什么都不干的时候,CPU 从0.9%降到0.1%到0.3%,内存从48 MB 降到43 MB。提交说明的大意是,睡眠和唤醒本来就是事件,不用轮询。

回头看,这跟9月的外观核对有点像,都是隔一会儿去问系统一次。外观那个多一步,问出不一样就动手。两件事隔了快两个月。

日历权限

还有一个小得多的撤回,在构建脚本上。

九月初的两三天里,提交标题里反复出现日历权限,一会儿是本地构建要保住它,一会儿是签名要带上它。后来构建脚本里又多了一道检查,描述文件(provisioning profile)里没有日历权限,就让构建直接失败。三个小时以后,另一个提交把这道检查拿掉了,标题大意是不再要求描述文件里有日历。

为什么撤,提交记录里没写,那个提交连正文都没有。