当然所有软件都不必第一时间更新到最新的,当然有更好用工具,当然即使更新到最新版本的软件也总是想退回到旧版本,当然使用这个工具并没有什么必要性...
去年疫情期间想着了解一下很火的 Rust ,那时升级了系统版本导致一直在用 MacUpdater 无法继续使用:他的 2.0 版本重新开始收费,1.0 版本不支持 macOS 13 。所以考虑自己做一个,当然由于自己学习能力有限,我代码写的很差
如果有谁感觉我写得太差能给我发一个更好的 Rust 中文学习指南的话,或者发个 pr 直接教我怎么写就更好了
appcu 不提供应用的版本信息数据库,appcu 仅通过 iTunes API 、应用官方的 Sparkle 链接信息、Homebrew-Cask API 进行查询,这意味着 appcu 的开发者无法获取到您的电脑上安装了哪些应用,同时 appcu 也不会收集您的任何信息
关于检查更新的原理:查询方式说明,经过我踩过的这些坑,我感觉写一个 GUI 的版本也不是不可行,但是 APPKit 我没用过、SwiftUI 不想写,所以只能抛砖引玉,静待大佬
由于检查方式的限制,所以一定有应用无法检查更新,可以通过配置忽略检查这些应用,或者设置 Homebrew-Api 查询别名
对所有 /Applications 路径下应用检查更新:
appcu
对特定路径应用检查更新:
appcu /Applications/xx.app /Applications/yy.app
使用 terminal-notifier
发送检查更新结果,点击通知下载更新的安装包或打开商店
appcu -n
使用 terminal-notifier
发送检查更新结果,点击通知打开应用或商店
appcu -no
定时检查更新(我现在的使用方式,一定要是绝对路径,一定要加参数 -n
或者 -no
,否则会输出到 mail 命令内)
0 10 * * * /path/to/appcu -n
当然,涉及到 terminal-notifier
的使用方法需要先安装 terminal-notifier
并在配置文件设置路径
其他命令参数和配置文件说明参考项目地址 ChengLuffy/application_check_update
由于项目 0 Stars (竟然是 0 欸!)没有满足发布 Homebrew 的最低要求,而由于自己学习能力差,自己的 HomeBrew 仓库仅编译了 Intel monterey 版本,所以推荐使用脚本安装,脚本由 ChatGPT 编写
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/chengluffy/application_check_update/master/appcu-install.sh)"
由于需要将 appcu 移动到 /usr/local/bin/ 文件夹下,所以需要 sudo 运行,您也可以通过 Releases 页面自行下载解压移动到 $PATH
路径下,注意如果您的机器是 Apple Silicon ,一定要下载 aarch64 版本,如果通过 Rosetta ,appcu 会输出 x86-64 版本的应用更新安装包的下载链接
很明显不会有人点击连接查看检查更新方式,我拼到下面了,希望能帮到后面想做类似东西的人
appcu 不提供应用的版本信息数据库,appcu 仅通过 iTunes API、应用官方的 Sparkle 链接、Homebrew-Cask API 进行查询,这意味着 appcu 的开发者无法获取到您的电脑上安装了哪些应用,同时 appcu 也不会收集您的任何信息
注意:下面介绍的顺序即为 appcu 判断应用需要采用那种方式检查更新的顺序
可以通过验证 xx.app/Wrapper/iTunesMetadata.plist
文件存在,确认使用该方式
需要注意的是某些 企业证书 签发的应用虽然存在该文件,但是无法检查更新。
大部分应用可以通过 iTunesMetadata.plist
读取到 bundle_id 值,但有些应用不可以,这时需要读取 Info.plist
文件获取
此类应用检查更新方式为:通过 iTunes API 查询
https://itunes.apple.com/{area_code}/lookup?bundleId={bundle_id}
可以通过验证 xx.app/Contents/_MASReceipt
文件夹存在,确认使用该方式
此类应用由于某些开发者在 iOS iPadOS macOS 的应用采用同样的 bundle_id,所以仅通过 iTunes API 无法确认 macOS 的版本号,需要基于 iTunes API 的返回结果中的 trackViewUrl 字段,获取 web 详情页面内容,通过 xpath 获取 //p[@class='l-column small-6 medium-12 whats-new__latest__version']
响应内容,解析后即为 macOS 应用的版本号。
可以通过验证 Info.plist
内存在 SUFeedURL
字段确认使用该方式
请求 SUFeedURL
,其内容类似 rss,解析可得应用版本号
需要注意的是,有些应用虽然可以通过其他方式确认是通过 Sparkle 分发版本的,但是 Info.plist
内不存在 SUFeedURL
字段,这时无法通过该方式获得应用版本号
关于版本号,有些应用是通过 CFBundleShortVersionString
进行比较的,有些应用是通过 CFBundleVersion
进行比较的,这取决于 SUFeedURL
提供的是什么值
通过 Homebrew-Cask API 进行查询
https://formulae.brew.sh/api/cask/{app_name}.json
app_name 其实就是应用的名称,需要将大写字母转换为小写字母,同时用 -
替换空格
需要注意的是,很多应用在 Hombrew-Cask 的名称和用户机器上的名称不一致,所以 appcu 提供了设置应用别名的方式,见alias
有些应用在 Apple Silicon 和 Intel 平台发布的是两个安装包,可以通过解析 Homebrew-Cask API 结果中的 variations
字段内容确认应该下载哪个版本
appcu 提供了忽略检查更新的方式,见ignore
1
windirt 2023-04-12 16:13:27 +08:00
没有应用信息库,没有 sparkle 和非 store 的 app 就无法刷新更新信息了..
macupdater 之所以贵,就是因为它维护了一个应用信息库... |
2
ChengLuffy OP |
3
duxiansen 2023-04-12 16:21:10 +08:00
一直用 MacUpdater 免费版,够我用了
|
4
ChengLuffy OP @duxiansen 我之前也用免费版,后来发现他的数据库有时候有些应用也不如 Homebrew-Cask 内的信息,于是自己写了一个
|
5
justNoBody 2023-04-12 17:28:21 +08:00
和直接执行 brew upgrade 有什么差别呢?
|
6
wupher 2023-04-12 17:34:54 +08:00
|
7
28Sv0ngQfIE7Yloe 2023-04-12 17:37:34 +08:00
|
8
JimmyLX 2023-04-12 17:57:51 +08:00
如果你有 MacUpdater 3.0 的 Beta 测试版本好像能一直用下去,前提是找得到安装包
我是一开始一直在用测试版,后来入正了 |
9
ChengLuffy OP @Morii
brew cu -a -f 在本机维护了一个已安装的版本号,但是如果你有通过应用内升级的情况,brew cu 会给出错误的结果,还有一个就是 brew cask 升级的会在我的 Mac 打乱启动台的布局 @justNoBody brew upgrade 不会检查没有通过 Homebrew-Cask 安装的软件 |
10
ChengLuffy OP @wupher
可能找到了 topgrade 我就不会想着做一个了,但是刚试了下 top 自动升级的太多了,而且他在我电脑上检查 npm 更新时崩了 |
11
ChengLuffy OP 太多只他升级的东西,我为了避免一些 bug 把 flutter 停留在了 2.x 版本,差点就被他 升级
|
13
kiritoyui 2023-04-12 21:21:18 +08:00
|
14
ChengLuffy OP @kiritoyui 哇,感谢推荐,如果我提前找到这些的话我肯定不会自己写的
|
15
JimmyLX 2023-04-12 21:41:29 +08:00
|
16
kiritoyui 2023-04-12 21:42:49 +08:00
@ChengLuffy 自己写一个也很了不起,就放练手了
|
17
ChengLuffy OP @JimmyLX MacUpdater 收费策略太恶心了,新系统我肯定要每年升级的,要不有些开发测试不好做,而按他的收费策略,我要一直买下去…
|
18
wupher 2023-04-12 23:43:18 +08:00
@ChengLuffy 你准确的说出了它的优点和缺点:啥都能升,默认啥都给升。 :-)
包括 vim-plugins, tmux-plugins, conda, pipx 这些小众冷僻的全给升了。 我出现过几次跑了这玩意,工程挂掉了的情况。 所以开发机都通过 .config 控制哪些让它碰。 |
19
vitaminx 2023-04-13 00:41:26 +08:00
op 的这个工具非常有用,brew cu -a -f 升级软件有有些软件会丢失数据,比如登陆信息等。我碰到过一次,由于安装的应用比较多,丢失信息很蛋痛,后来再也不敢这样粗暴处理了。
如果有一个 GUI 界面可以勾选哪些升级哪些不升级就比较完美了! |
20
ChengLuffy OP @vitaminx 由于我没学过 AppKit ,GUI 暂时做不出来,现在可以通过 `ignore` 命令忽略应用查询,忽略的应用记录在配置文件中
|
21
ychen997 2023-04-18 07:08:49 +08:00
@vitaminx #19 关于这个问题,brew cu -f -a 再升级的时候会移除.app 再重新下载,有可能会丢失.app 内的数据。我感觉还是交给 app 内部的自动升级比较好,brew cu (不加-f -a )会忽略 auto upgrade 的软件,所以我目前就是用`topgrade --only brew_formula brew_cask vim tldr shell
`,甚至 mas upgrade 都不用( mas 会跟 app store 的版本号不一致),还没有试 op 的工具不过已经给了 star ,不知道 op 的工具是怎么处理这些 auto upgrade 的软件的,不知道是不是像 brew cu -f 一样卸载再重新下载。 |
22
ChengLuffy OP @ychen997 这个工具仅输出更新版本的下载链接,结合 -n 参数可以点击更新通知直接下载,也可以设置为点击打开应用在应用内自行更新
工具默认对 /Applications/ 文件下所有应用进行扫描,homebrew-cask API 仅作为一种查询最新版本号的方式 |