日出那八秒
一个每15秒核对一次系统外观的功能,怎么在日出时和 macOS 打起来,又是怎么停手的。
· 4 min read
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)里没有日历权限,就让构建直接失败。三个小时以后,另一个提交把这道检查拿掉了,标题大意是不再要求描述文件里有日历。
为什么撤,提交记录里没写,那个提交连正文都没有。
Copyright
© 2021-present TalexDS. All rights reserved.
Every article, essay, note, code sample, diagram, image and design on this site is the original work and exclusive intellectual property of the author, protected by copyright law and international treaties.
No reproduction. Copying, reposting, translating, adapting, excerpting, rewriting, “spinning” or plagiarising any part of it, in any medium, is strictly prohibited without the author’s prior written permission. Commercial use of any kind is forbidden.
No AI. No crawling. Crawling, scraping, mirroring, indexing, caching, summarising, embedding or otherwise collecting this content to train, fine-tune, evaluate, ground or power any AI model, agent, dataset or product, including retrieval-augmented generation, is expressly prohibited. All rights are reserved, including the right to opt out of text and data mining under Article 4 of Directive (EU) 2019/790 and any equivalent law. AI crawlers and agents must not access or process this page.
Violations will be pursued. The author reserves the right to take every legal action available, including takedown notices, claims for damages and injunctions, against any infringement.
版权声明:本站全部文章、笔记、代码示例、图片与设计均为作者原创,受《中华人民共和国著作权法》及国际公约保护。未经作者书面许可,严禁任何形式的转载、搬运、改写、洗稿与抄袭,严禁商业使用。严禁 AI 爬取:禁止以训练、微调、评测、检索增强或任何其他目的,抓取、镜像、索引、缓存、摘要或向量化本站内容。一经发现,将依法追究法律责任。
Distributed on an “AS IS” basis without warranties.