使用codesign签名后macOS app无法访问网络的问题排查求助
问题分析与解决方案
核心原因推测
根据你的描述,签名后无法访问HTTPS资源的问题大概率和签名权限传递错误、Mac App Store专属权限缺失以及--deep参数的滥用有关,结合你使用的Unity和系统版本,具体可能是这几点:
--deep签名会递归处理嵌套组件,但容易导致entitlements权限没有正确应用到所有二进制文件(比如Unity打包的框架、插件),ATS配置因此失效。- 缺少Mac App Store要求的网络权限声明,即使Info.plist配置了ATS,签名系统也会限制网络访问。
- Unity 2019.2.x的部分版本存在Mac App Store构建的签名兼容性问题,导致ATS配置被意外覆盖。
分步解决途径
1. 重构签名流程,弃用--deep
--deep看似方便,但对Unity这类包含大量嵌套框架的应用很容易出问题。正确的做法是先单独签名所有嵌套组件,再签名主应用:
# 遍历并签名Contents/Frameworks下的所有框架 find "/AppPath/GAMENAME.app/Contents/Frameworks" -name "*.framework" -exec codesign -f -s '3rd Party Mac Developer Application: DEVELOPER NAME' --entitlements "GAMENAME.entitlements" {} \; # 若有其他插件(比如.bundle文件),同样单独签名 find "/AppPath/GAMENAME.app/Contents/PlugIns" -name "*.bundle" -exec codesign -f -s '3rd Party Mac Developer Application: DEVELOPER NAME' --entitlements "GAMENAME.entitlements" {} \; # 最后签名主应用 codesign -f -s '3rd Party Mac Developer Application: DEVELOPER NAME' --entitlements "GAMENAME.entitlements" "/AppPath/GAMENAME.app"
2. 完善Entitlements文件
Mac App Store要求必须在entitlements中声明网络权限,否则即使Info.plist配置了ATS也会被限制。确保你的GAMENAME.entitlements包含以下内容:
<?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> <!-- 声明客户端网络访问权限(Mac App Store必填) --> <key>com.apple.security.network.client</key> <true/> <!-- 若不需要作为服务器接收请求,设为false即可 --> <key>com.apple.security.network.server</key> <false/> </dict> </plist>
3. 锁定Info.plist的ATS配置
- 确认Unity生成的Info.plist中
NSAppTransportSecurity配置正确,比如全局允许任意加载:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
- 签名前备份Info.plist,签名后对比原文件,确保ATS配置没有被签名工具意外修改。
4. 验证签名与权限
用以下命令检查签名是否生效,以及entitlements是否正确应用:
# 查看应用的entitlements codesign -d --entitlements - "/AppPath/GAMENAME.app"
输出结果中必须包含com.apple.security.network.client = true,否则说明权限没加上。
另外用spctl验证应用是否符合Mac App Store规范:
spctl --assess --verbose=4 "/AppPath/GAMENAME.app"
5. 排查系统权限与Unity版本
- 在macOS Catalina的
系统偏好设置 > 安全性与隐私 > 隐私 > 网络中,确认你的应用已被授予网络访问权限;如果不在列表中,删除应用的偏好文件(~/Library/Preferences/com.yourcompany.gamename.plist)后重新运行,触发权限提示。 - 尝试升级Unity到2019.2系列的最新补丁版本(比如2019.2.21f1),该版本修复了多个Mac App Store构建的签名兼容性问题。
内容的提问来源于stack exchange,提问作者Nimesh Neema
相关产品推荐
相关产品推荐

