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

如何为Swift Package的测试目标启用Keychain sharing功能

实现方案

该需求完全可以实现,不需要单独创建Xcode项目,仅通过Package.swift配置和新增entitlements文件即可解决,操作步骤如下:

1. 确认Swift工具链与平台版本要求

首先需要确保你的Package.swift使用的Swift工具链版本不低于5.3,同时明确指定支持的平台最低版本,Keychain相关API对系统版本有基础要求:

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "你的包名",
    platforms: [
        .iOS(.v14),
        .macOS(.v11)
    ],
    // 原有products、dependencies等配置保持不变

2. 新增测试用entitlements文件

在你的测试目标对应的源码目录下,新建名为TestHost.entitlements的权限配置文件,写入Keychain Sharing的相关配置:

<?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>keychain-access-groups</key>
	<array>
        <!-- 测试场景下可以直接用通配符匹配所有同前缀Keychain项,无需指定固定组名 -->
		<string>$(AppIdentifierPrefix)*</string>
	</array>
</dict>
</plist>

3. 修改测试目标配置

在Package.swift中找到你的测试目标声明,新增entitlements路径配置:

.target(
    name: "你的正式目标名",
    dependencies: []),
.testTarget(
    name: "你的测试目标名",
    dependencies: ["你的正式目标名"],
    // 新增entitlements配置,路径替换为你实际存放entitlements文件的路径
    entitlements: .path("Sources/你的测试目标名/TestHost.entitlements")
)

额外适配(仅iOS平台需要)

如果是iOS平台测试仍有权限报错,可以在测试目标源码中新增一个空的测试宿主入口,避免XCTest自动生成的宿主未正确加载权限:

  1. 新增TestAppDelegate.swift文件到测试目标源码目录:
import UIKit

@UIApplicationMain
class TestAppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
}
  1. 在测试目标配置中补充Info.plist配置:
.testTarget(
    name: "你的测试目标名",
    dependencies: ["你的正式目标名"],
    infoPlist: .dictionary([
        "CFBundleIdentifier": "com.yourcompany.TestHost",
        "UIApplicationPrincipalClass": "TestAppDelegate"
    ]),
    entitlements: .path("Sources/你的测试目标名/TestHost.entitlements")
)

配置完成后清理Xcode缓存重新运行测试即可正常访问Keychain。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:27:02