You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS Electron应用提交App Store失败,报退出码173问题咨询

解决Mac App Store Electron应用因收据验证失败(错误码173)被拒的问题

我之前也碰到过一模一样的情况,哪怕没有内购(IAP),Mac App Store上架的应用必须通过系统的应用收据验证——这是苹果的强制要求,和有没有内购完全无关。错误码173正是系统层面收据验证失败的典型表现,下面是一步步的排查和解决方法:

一、先明确核心原因

Mac App Store分发的应用,系统会在启动时自动检查应用收据(不是内购收据,是应用本身的购买/下载收据)。如果验证不通过,系统就会直接终止应用,并提示“已损坏,无法打开”,这和你有没有自己做验证逻辑无关。

二、具体排查和修复步骤

1. 检查Electron打包配置(重点!)

如果你用的是electron-builder这类主流打包工具,确保以下配置正确:

  • 启用hardenedRuntime(硬运行时):这是现在Mac App Store上架的必备要求
  • 配置正确的entitlements和entitlementsInherit文件,确保包含必要的权限:
    示例entitlements.plist内容:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <!-- 沙箱权限(如果你的应用使用沙箱) -->
      <key>com.apple.security.app-sandbox</key>
      <true/>
      <!-- 允许网络请求(用于验证收据) -->
      <key>com.apple.security.network.client</key>
      <true/>
      <!-- 允许读取收据文件 -->
      <key>com.apple.security.files.user-selected.read-only</key>
      <true/>
    </dict>
    </plist>
    
  • 确保打包时指定了正确的Apple Developer签名身份,并且完成了公证(notarization)

2. 添加基础的收据验证逻辑

哪怕你不需要处理内购,也要在主进程中添加简单的收据检查逻辑,确保应用能配合系统的验证流程:

const { app, dialog } = require('electron');
const fs = require('fs');
const path = require('path');

app.on('ready', async () => {
  // 检查系统收据文件是否存在
  const receiptPath = path.join(app.getPath('appData'), '../Receipts/com.yourcompany.yourapp.storekit');
  if (!fs.existsSync(receiptPath)) {
    console.error('应用收据文件不存在');
    // 不要直接退出应用,而是提示用户尝试重新下载或联系支持
    dialog.showErrorBox('启动失败', '无法验证应用收据,请尝试重新下载应用或联系客服');
  }

  // 可选:实现基础的收据验证逻辑(参考苹果的Receipt Validation Programming Guide)
  // 你可以自己解析收据文件,或者用第三方库简化流程
});

3. 按照苹果的要求复现问题

苹果提到的QA1778是关键,一定要用和提交审核完全一致的包来测试:

  • 创建一个干净的测试环境(比如新建macOS用户、用虚拟机)
  • 登录你的App Store开发者账号,安装提交的包
  • 查看控制台日志(Console.app),除了错误码173,找更详细的失败原因(比如签名不匹配、网络无法连接验证服务器等)

4. 验证签名和公证状态

用终端命令检查打包后的应用:

  • 检查签名详情:codesign -dv --verbose=4 /path/to/your/app.app,确认Entitlements配置正确
  • 检查公证状态:spctl -a -v /path/to/your/app.app,确保输出显示accepted

三、为什么之前的版本能成功?

大概率是苹果的审核标准收紧了,或者你这次打包时修改了配置(比如升级了electron-builder版本,默认配置变化;或者新增了沙箱但没配全权限),导致之前的验证逻辑现在不满足要求了。

内容的提问来源于stack exchange,提问作者Rubycon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:52:50