返回

解决 Tun2Socks "Failed to install app" 错误 (Xcode 16)

IOS

解决使用 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。 任何不匹配会导致安装失败.

操作步骤:

  1. 检查 Tun2socks.framework 是否正确地嵌入项目中。 确认 Build Phases -> Embed Frameworks 中列出了 Tun2socks.framework.
  2. 确保 "Code Sign On Copy" 选项对 Tun2socks.framework 已勾选。 这能保证框架在复制到目标时进行正确的代码签名。
  3. 清理项目(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,导致无法找到文件。 可以手动创建该文件并将其正确嵌入项目。

操作步骤:

  1. 在项目导航栏找到 Tun2socks.framework. 检查该文件夹内容中是否有 Info.plist。如果不存在,执行下一步。
  2. 创建一个 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>
  1. 确认文件被正确添加到框架目录下后,清理并重新构建项目.

安全建议: 手动创建 Info.plist 文件需要注意安全配置,避免引入配置风险. 请参考 outline-go-tun2socks 的项目文档中的Info.plist 例子,补充必要安全设置.

方案三: 调整 Build Settings

原理: Xcode 16.0 可能更改了某些默认构建设置。审查并修改部分构建设置,可以帮助处理潜在兼容性问题。

操作步骤:

  1. 打开 Build Settings,搜索 "Packaging" 部分的设置.
  2. 尝试设置 Validate WorkspaceYES ,查看能否解决兼容问题. 该设置在 Xcode 16.0 有时候需要被显式地打开.
  3. 检查 Generate Info.plist File, 若看到与该 Info.plist 自动生成的相关选项,可以更改或者禁用.
  4. 在 "Signing" 选项中检查 Other Code Signing Flags. 可以尝试添加 --generate-entitlement-der 标志,看能否提供某些兼容性.

命令行构建中的修改:

如果使用的是命令行 xcodebuild,可以调整对应的构建参数:

xcodebuild OTHER_CODE_SIGN_FLAGS="--generate-entitlement-der"

注意: 构建参数可能需要根据具体的 Xcode 版本和项目配置做适当的调整.

方案四: 使用最新版 outline-go-tun2socks

原理 : outline-go-tun2socks 的新版本, 可能解决这些构建和兼容问题。 尝试把库更新到最新版。

操作步骤:

  1. 访问项目代码仓库, Tun2Socks. 查看文档或者issue, 搜索和 Xcode 16 相关内容.
  2. 如果有更新的发布, 遵循官方的指示进行集成。通常来说, 直接在项目内更换 framework 文件就可以。
  3. 测试问题是否已经解决.

补充信息 : 建议定期地进行项目依赖检查,更新项目的各种第三方库到最新版。这是一种减少出现各种兼容性问题的方式,也能够及时地弥补库中的潜在的安全漏洞。