锦方的个人网页 · 如果有一天你突然想起了我


一个Mac截图工具,从能截图到能上架还差多远

目录

最近我在做一个叫幕摘的macOS截图工具。

一开始我觉得截图工具的功能很明确:按下快捷键,选择一个区域,截完以后保存或者复制就可以了。

真正准备上架时才发现,能在自己的电脑上截到一张图,只能说明最基本的功能跑通了。离一个可以交给其他人使用、可以提交到Mac App Store的软件,还有很长一段距离。

能截图只是第一步

截图工具首先要处理选区、窗口和全屏截图。看起来都是得到一张图片,实际走的流程并不完全一样。

选区要处理拖动方向、最小尺寸、取消操作和多显示器坐标。窗口截图要识别用户真正选择的窗口,还要处理窗口阴影、缩放比例和跨屏位置。全屏截图也要考虑多个显示器以及不同的分辨率。

我后来又给选区增加了移动和缩放。用户第一次框选不准确时,可以继续调整,而不是取消以后重新截一次。

这些功能在一台Mac上正常还不够,换成外接显示器、不同缩放比例或者窗口位于屏幕边缘时,坐标就可能出现偏差。

快捷键和截图权限必须放在真实环境里测试

截图工具需要全局快捷键,也需要macOS的屏幕录制权限。

开发时从Xcode或终端启动,快捷键可能正常,系统权限也已经给过。但应用的路径、Bundle ID或者签名发生变化后,macOS可能把它当成另一个应用,原来的权限状态不能直接代表发布版本。

所以我不能只在应用自己的窗口里点一次截图按钮。还要切换到其他软件,用全局快捷键开始截图;退出幕摘再重新打开,然后再测试一次。

如果每次构建都使用临时签名,屏幕录制权限看起来还可能时好时坏。这个问题不一定是截图代码坏了,也可能是系统不再信任当前这个构建。

OCR不是调用一次接口就结束

幕摘支持在截图后识别文字,也可以导入本地图片做OCR。

OCR使用系统的Vision能力,本地识别,不需要把截图默认上传到服务器。但接入识别只是第一步,实际还要处理图片里没有文字、识别失败、多语言、很大的图片、连续识别和复制失败等情况。

如果没有识别到文字,软件应该明确告诉用户,而不是一直显示加载状态。连续导入多张大图时,也不能同时启动太多识别任务,把内存和处理器占满。

识别结果显示出来以后,还要考虑文字块的位置、点击复制,以及截图经过裁剪和缩放后,文字位置能不能继续对应到原图。

所以OCR能返回一段文字,不等于这个功能已经可以交付。

沙盒会重新限制软件能做什么

本地开发版本能访问的内容,放进Mac App Store沙盒以后不一定还能访问。

文件需要由用户主动选择,保存位置需要得到授权,有些依赖辅助功能或跨应用读取的能力也不适合直接放进首个上架版本。

我最后把App Store首版的能力限制在选区、窗口、全屏截图、OCR、系统翻译、标注、打码、导出和基础录屏。依赖更广权限、还没有完成隐私边界说明的功能先隐藏,不因为代码里已经有了就全部开放。

这个过程让我意识到,上架不是把开发版打一个包。发布版本需要重新回答一个问题:这个功能为什么需要这项权限,用户是否主动触发,数据去了哪里,失败以后会发生什么。

本地构建成功不代表签名正确

平时我可以用临时签名运行幕摘,也可以通过单元测试和基本检查。但这种构建只能证明开发流程没有明显问题,不能证明它可以提交到App Store。

正式包还要检查Bundle ID、签名证书、Team ID、provisioning profile、沙盒权限和应用里的可执行文件架构。Apple Silicon和Intel Mac都要支持时,还要确认最终包确实包含两个架构,而不是只在当前电脑上可以运行。

只要其中一项不一致,就可能出现本地能打开、上传失败,或者上传成功但审核环境里行为不同的情况。

内购还要单独验证

幕摘的付费版本通过StoreKit解锁。这里也不是把商品ID写进代码就结束了。

购买、恢复购买、用户取消、等待处理和加载失败都要有对应状态。商品暂时无法从App Store加载时,界面应该允许重试,不能把空商品列表当成已经准备完成。

我还遇到过审核时内购商品无法加载的问题。本地StoreKit配置可以正常工作,不代表真实App Store环境里的商品状态、提交关系和审核包一定正确。

所以内购既要测试代码,也要检查App Store Connect里的商品状态,并用沙盒账号走一遍真实购买和恢复流程。

最后还是要人工操作一遍

自动检查可以发现很多问题,例如代码能不能构建、测试是否通过、签名和沙盒权限是否符合预期。

但截图软件与系统交互很多,最后仍然要在真正签名的沙盒应用上人工操作。

我会从另一个前台软件触发快捷键,检查选区、窗口和全屏截图;退出并重启后再触发一次;测试无文字OCR、复制和保存;再检查外接显示器、权限失败和录屏停止后的文件是否正常。

这些步骤比较慢,也不能因为一次自动检查通过就省略。

我的结论

一个Mac截图工具,从能截图到能上架,中间差的不是再增加几个按钮。

真正困难的是系统权限能不能稳定、不同屏幕上的坐标是否准确、OCR失败时有没有清楚的反馈、沙盒里是否仍然能工作、签名和内购在真实环境里是否正确,以及这些事情有没有经过人工验证。

我现在不会再把“在自己的电脑上可以运行”当成完成。开发构建通过只是开始,真正的发布版本还要经过权限、沙盒、签名、StoreKit和实机操作这一整套检查。


上面都是ai写的,主要自己需要一个截图工具,可以自定义快捷键截图,如果还能标注就更好了。

系列:note

该系列自动来自分类: note

  1. Gemini 3.6 Flash完美弥补了Codex 5.6
  2. macOS 外置硬盘为什么会出现 ._* 文件
  3. 小众工具软件应该免费、买断还是订阅
  4. 用iPhone和iPad维护Git静态网站可行吗
  5. 一个Mac截图工具,从能截图到能上架还差多远 (当前)
  6. 重复文件清理工具最危险的不是漏扫,而是误删
  7. 备份dokuwiki数据
  8. grep 命令
  9. zola的Front Matter完整字段的意思
  10. 从dokuwiki切换到quartz
  11. 安装immich记录
  12. 修改dokuwiki时区
  13. macos安装dokuwiki
  14. Debian创建新用户和设置防火墙
  15. mac在Debian安装wireguard和使用
  16. 再也不买不能解bl的手机了
  17. Firefox设置
  18. debian安装FFmpeg来合并youtube音频
  19. css 扩散列表
  20. 两个练习
  21. css RWD
  22. css 图片
  23. css 提示
  24. css 下拉
  25. css 表单
  26. css 导航栏
  27. css 单词
  28. HTML SVG
  29. HTML Canvas
  30. HTML input
  31. HTML 结构
  32. 电气施工图说明
  33. china uses dropbox
  34. Nginx installs SSL certificates
  35. debian install shadowsocks
  36. Visual studio code set the python environment
  37. install hexo

下一篇推荐

系列继续阅读

重复文件清理工具最危险的不是漏扫,而是误删