V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ChengLuffy
V2EX  ›  macOS

macOS 应用检查更新命令行工具

  •  
  •   ChengLuffy · 2023-04-12 14:26:37 +08:00 · 2457 次点击
    这是一个创建于 625 天前的主题,其中的信息可能已经有所发展或是发生改变。

    说明:

    当然所有软件都不必第一时间更新到最新的,当然有更好用工具,当然即使更新到最新版本的软件也总是想退回到旧版本,当然使用这个工具并没有什么必要性...

    去年疫情期间想着了解一下很火的 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 版本的应用更新安装包的下载链接

    第 1 条附言  ·  2023-04-12 19:29:31 +08:00

    很明显不会有人点击连接查看检查更新方式,我拼到下面了,希望能帮到后面想做类似东西的人

    查询方式说明

    appcu 不提供应用的版本信息数据库,appcu 仅通过 iTunes API、应用官方的 Sparkle 链接、Homebrew-Cask API 进行查询,这意味着 appcu 的开发者无法获取到您的电脑上安装了哪些应用,同时 appcu 也不会收集您的任何信息

    注意:下面介绍的顺序即为 appcu 判断应用需要采用那种方式检查更新的顺序

    MAS 安装的应用

    1. Apple Silicon 支持的 macOS 上,通过 Mac App Store 安装的 iPad 应用

    可以通过验证 xx.app/Wrapper/iTunesMetadata.plist 文件存在,确认使用该方式

    需要注意的是某些 企业证书 签发的应用虽然存在该文件,但是无法检查更新。

    大部分应用可以通过 iTunesMetadata.plist 读取到 bundle_id 值,但有些应用不可以,这时需要读取 Info.plist 文件获取

    此类应用检查更新方式为:通过 iTunes API 查询

    https://itunes.apple.com/{area_code}/lookup?bundleId={bundle_id}
    
    1. 其他通过 Mac App Store 安装的应用

    可以通过验证 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 应用的版本号。

    通过 Sparkle 分发版本的应用

    可以通过验证 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

    23 条回复    2023-09-19 09:49:16 +08:00
    windirt
        1
    windirt  
       2023-04-12 16:13:27 +08:00
    没有应用信息库,没有 sparkle 和非 store 的 app 就无法刷新更新信息了..

    macupdater 之所以贵,就是因为它维护了一个应用信息库...
    ChengLuffy
        2
    ChengLuffy  
    OP
       2023-04-12 16:18:45 +08:00
    @windirt 还有 Homebrew-Cask-Api ,也算一个比较完备的数据库

    我感觉升级系统后 MacUpdater 1.0 就自己退出不让用就有点不合理
    duxiansen
        3
    duxiansen  
       2023-04-12 16:21:10 +08:00
    一直用 MacUpdater 免费版,够我用了
    ChengLuffy
        4
    ChengLuffy  
    OP
       2023-04-12 16:25:46 +08:00
    @duxiansen 我之前也用免费版,后来发现他的数据库有时候有些应用也不如 Homebrew-Cask 内的信息,于是自己写了一个
    justNoBody
        5
    justNoBody  
       2023-04-12 17:28:21 +08:00
    和直接执行 brew upgrade 有什么差别呢?
    wupher
        6
    wupher  
       2023-04-12 17:34:54 +08:00
    28Sv0ngQfIE7Yloe
        7
    28Sv0ngQfIE7Yloe  
       2023-04-12 17:37:34 +08:00
    JimmyLX
        8
    JimmyLX  
       2023-04-12 17:57:51 +08:00
    如果你有 MacUpdater 3.0 的 Beta 测试版本好像能一直用下去,前提是找得到安装包
    我是一开始一直在用测试版,后来入正了
    ChengLuffy
        9
    ChengLuffy  
    OP
       2023-04-12 19:15:41 +08:00
    @Morii
    brew cu -a -f 在本机维护了一个已安装的版本号,但是如果你有通过应用内升级的情况,brew cu 会给出错误的结果,还有一个就是 brew cask 升级的会在我的 Mac 打乱启动台的布局

    @justNoBody
    brew upgrade 不会检查没有通过 Homebrew-Cask 安装的软件
    ChengLuffy
        10
    ChengLuffy  
    OP
       2023-04-12 19:24:10 +08:00
    @wupher
    可能找到了 topgrade 我就不会想着做一个了,但是刚试了下 top 自动升级的太多了,而且他在我电脑上检查 npm 更新时崩了
    ChengLuffy
        11
    ChengLuffy  
    OP
       2023-04-12 19:26:12 +08:00
    太多只他升级的东西,我为了避免一些 bug 把 flutter 停留在了 2.x 版本,差点就被他 升级
    Silently
        12
    Silently  
       2023-04-12 19:42:03 +08:00 via iPhone
    @JimmyLX 我也是这个 入正了
    kiritoyui
        13
    kiritoyui  
       2023-04-12 21:21:18 +08:00
    ChengLuffy
        14
    ChengLuffy  
    OP
       2023-04-12 21:35:59 +08:00 via iPhone
    @kiritoyui 哇,感谢推荐,如果我提前找到这些的话我肯定不会自己写的
    JimmyLX
        15
    JimmyLX  
       2023-04-12 21:41:29 +08:00
    @kiritoyui
    @ChengLuffy
    我对比过这个,MacUpdater 数据还是更全面的
    Lastest 能检测我电脑上 60 多个软件,Updater 是 140 个
    kiritoyui
        16
    kiritoyui  
       2023-04-12 21:42:49 +08:00
    @ChengLuffy 自己写一个也很了不起,就放练手了
    ChengLuffy
        17
    ChengLuffy  
    OP
       2023-04-12 23:10:13 +08:00 via iPhone
    @JimmyLX MacUpdater 收费策略太恶心了,新系统我肯定要每年升级的,要不有些开发测试不好做,而按他的收费策略,我要一直买下去…
    wupher
        18
    wupher  
       2023-04-12 23:43:18 +08:00
    @ChengLuffy 你准确的说出了它的优点和缺点:啥都能升,默认啥都给升。 :-)

    包括 vim-plugins, tmux-plugins, conda, pipx 这些小众冷僻的全给升了。

    我出现过几次跑了这玩意,工程挂掉了的情况。

    所以开发机都通过 .config 控制哪些让它碰。
    vitaminx
        19
    vitaminx  
       2023-04-13 00:41:26 +08:00
    op 的这个工具非常有用,brew cu -a -f 升级软件有有些软件会丢失数据,比如登陆信息等。我碰到过一次,由于安装的应用比较多,丢失信息很蛋痛,后来再也不敢这样粗暴处理了。

    如果有一个 GUI 界面可以勾选哪些升级哪些不升级就比较完美了!
    ChengLuffy
        20
    ChengLuffy  
    OP
       2023-04-13 09:16:38 +08:00
    @vitaminx 由于我没学过 AppKit ,GUI 暂时做不出来,现在可以通过 `ignore` 命令忽略应用查询,忽略的应用记录在配置文件中
    ychen997
        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 一样卸载再重新下载。
    ChengLuffy
        22
    ChengLuffy  
    OP
       2023-04-18 08:48:09 +08:00 via iPhone
    @ychen997 这个工具仅输出更新版本的下载链接,结合 -n 参数可以点击更新通知直接下载,也可以设置为点击打开应用在应用内自行更新
    工具默认对 /Applications/ 文件下所有应用进行扫描,homebrew-cask API 仅作为一种查询最新版本号的方式
    F1ySyn
        23
    F1ySyn  
       2023-09-19 09:49:16 +08:00
    @JimmyLX MacUpdater 负责中文翻译的小透明路过,现在测试版也是需要激活的。有联网验证,不过 3.0 beta 的时候我好多翻译都还没有同步过去,还是用着 2.x 的翻译
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   990 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:39 · PVG 03:39 · LAX 11:39 · JFK 14:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.