解决 Tun2Socks "Failed to install app" 错误 (Xcode 16)
2024-12-21 18:57:50
解决使用 Tun2Socks 时出现的 “Failed to install app” 问题
项目开发阶段,应用程序无法正确安装,问题排查比较麻烦. 基于Tun2Socks
库开发的应用,在安装阶段遇到错误Failed to load Info.plist
,这类问题的常见原因是 Xcode 版本的更迭引入了新的构建机制或限制. 以下分析问题的原因和解决手段。
问题分析
开发环境升级 Xcode 到 16.0 后,应用安装失败并提示:
Failed to load Info.plist from bundle at path /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.bXX17P/extracted/Vpn.app/Frameworks/Tun2socks.framework; Extra info about "/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.bXX17P/extracted/Vpn.app/Frameworks/Tun2socks.framework/Info.plist": Couldn't stat /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.bXX17P/extracted/Vpn.app/Frameworks/Tun2socks.framework/Info.plist: No such file or directory
错误指出,安装进程找不到 Tun2socks.framework
中的 Info.plist
文件. 在 Xcode 15.2 及更早版本,这一步骤正常执行, 表明新版本的 Xcode 对构建或者签名过程存在某些调整. 由于无法简单降级 Xcode 版本 (由于macOS 15.0 "Sequoia" 的限制), 解决问题的重点集中于项目的配置调整.
解决方案
下面,提出几种方案,一步一步解决Info.plist
的问题。
方案一: 验证 Framework 嵌入与签名
原理: Xcode 可能要求所有嵌入的 Framework 都正确签名且包含必要的 Info.plist
。 任何不匹配会导致安装失败.
操作步骤:
- 检查
Tun2socks.framework
是否正确地嵌入项目中。 确认Build Phases
->Embed Frameworks
中列出了Tun2socks.framework
. - 确保 "Code Sign On Copy" 选项对
Tun2socks.framework
已勾选。 这能保证框架在复制到目标时进行正确的代码签名。 - 清理项目(Product -> Clean Build Folder),然后重新构建 (Product -> Build).
命令行操作 :
若使用命令行构建,可确保 xcodebuild
命令包含适当的签名标志:
xcodebuild -workspace YourWorkspace.xcworkspace -scheme YourScheme -sdk iphoneos -configuration Release CODE_SIGN_IDENTITY="Your Code Sign Identity" CODE_SIGNING_REQUIRED=YES CODE_SIGNING_ALLOWED=YES
注意: 将 "Your Code Sign Identity" 替换成实际签名证书.
方案二:手动创建/确保 Info.plist 存在
原理: Info.plist
文件在某些情形下可能没有被正确地包含进 Tun2socks.framework
,导致无法找到文件。 可以手动创建该文件并将其正确嵌入项目。
操作步骤:
- 在项目导航栏找到
Tun2socks.framework
. 检查该文件夹内容中是否有Info.plist
。如果不存在,执行下一步。 - 创建一个
Info.plist
文件,并添加到Tun2socks.framework
目录下。基本的Info.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>CFBundleIdentifier</key>
<string>org.jigsaw.Tun2socks</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CFBundleExecutable</key>
<string>Tun2socks</string>
<key>CFBundleName</key>
<string>Tun2socks</string>
</dict>
</plist>
- 确认文件被正确添加到框架目录下后,清理并重新构建项目.
安全建议: 手动创建 Info.plist
文件需要注意安全配置,避免引入配置风险. 请参考 outline-go-tun2socks
的项目文档中的Info.plist
例子,补充必要安全设置.
方案三: 调整 Build Settings
原理: Xcode 16.0 可能更改了某些默认构建设置。审查并修改部分构建设置,可以帮助处理潜在兼容性问题。
操作步骤:
- 打开
Build Settings
,搜索 "Packaging" 部分的设置. - 尝试设置
Validate Workspace
为YES
,查看能否解决兼容问题. 该设置在 Xcode 16.0 有时候需要被显式地打开. - 检查
Generate Info.plist File
, 若看到与该Info.plist
自动生成的相关选项,可以更改或者禁用. - 在 "Signing" 选项中检查
Other Code Signing Flags
. 可以尝试添加--generate-entitlement-der
标志,看能否提供某些兼容性.
命令行构建中的修改:
如果使用的是命令行 xcodebuild
,可以调整对应的构建参数:
xcodebuild OTHER_CODE_SIGN_FLAGS="--generate-entitlement-der"
注意: 构建参数可能需要根据具体的 Xcode 版本和项目配置做适当的调整.
方案四: 使用最新版 outline-go-tun2socks
原理 : outline-go-tun2socks
的新版本, 可能解决这些构建和兼容问题。 尝试把库更新到最新版。
操作步骤:
- 访问项目代码仓库, Tun2Socks. 查看文档或者
issue
, 搜索和 Xcode 16 相关内容. - 如果有更新的发布, 遵循官方的指示进行集成。通常来说, 直接在项目内更换 framework 文件就可以。
- 测试问题是否已经解决.
补充信息 : 建议定期地进行项目依赖检查,更新项目的各种第三方库到最新版。这是一种减少出现各种兼容性问题的方式,也能够及时地弥补库中的潜在的安全漏洞。