本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Swift 故障排除
以下信息可协助您处理 Swift 和 CodeArtifact 中的常见问题。
即使在配置了 Swift 程序包管理器之后,我在 Xcode 中还是出现了 401 错误
问题:当您尝试将 CodeArtifact 存储库中的一个程序包作为依赖项添加到 Xcode 中的 Swift 项目时,即使您按照将 Swift 连接到 CodeArtifact 的说明操作,您也会收到 401 未经授权错误。
可能的解决方法:这个问题是由于存储 CodeArtifact 凭证的 macOS 钥匙串应用程序存在问题而引起。要解决这个问题,我们建议打开钥匙串应用程序并删除所有 CodeArtifact 条目,然后按照使用 CodeArtifact 配置 Swift 程序包管理器中的说明再次使用 CodeArtifact 存储库配置 Swift 程序包管理器。
由于钥匙串提示输入密码,Xcode 在 CI 计算机上挂起
问题:当您尝试从 CodeArtifact 中提取 Swift 程序包作为持续集成(CI)服务器上 Xcode 内部版本的一部分(例如使用 GitHub Actions)时,使用 CodeArtifact 进行的身份验证可能会挂起并最终失败,显示类似于以下内容的错误消息:
Failed to save credentials for \'https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com\' to keychain: status -60008
可能的解决方法:这是因为未将凭证保存到 CI 计算机上的钥匙串中,而 Xcode 仅支持保存在钥匙串中的凭证。要解决这个问题,建议使用以下步骤手动创建钥匙串条目:
-
准备钥匙串。
KEYCHAIN_PASSWORD=$(openssl rand -base64 20) KEYCHAIN_NAME=login.keychain SYSTEM_KEYCHAIN=/Library/Keychains/System.keychain if [ -f $HOME/Library/Keychains/"${KEYCHAIN_NAME}"-db ]; then echo "Deleting old ${KEYCHAIN_NAME} keychain" security delete-keychain "${KEYCHAIN_NAME}" fi echo "Create Keychain" security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" EXISTING_KEYCHAINS=( $( security list-keychains | sed -e 's/ *//' | tr '\n' ' ' | tr -d '"') ) sudo security list-keychains -s "${KEYCHAIN_NAME}" "${EXISTING_KEYCHAINS[@]}" echo "New keychain search list :" security list-keychain echo "Configure keychain : remove lock timeout" security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" security set-keychain-settings "${KEYCHAIN_NAME}" -
获取 CodeArtifact 身份验证令牌和您的存储库端点。
export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \ --regionus-west-2\ --domainmy_domain\ --domain-owner111122223333\ --query authorizationToken \ --output text` export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint \ --regionus-west-2\ --domainmy_domain\ --domain-owner111122223333\ --format swift \ --repositorymy_repo\ --query repositoryEndpoint \ --output text` -
手动创建钥匙串条目。
SERVER=$(echo $CODEARTIFACT_REPO | sed 's/https:\/\///g' | sed 's/.com.*$/.com/g') AUTHORIZATION=(-T /usr/bin/security -T /usr/bin/codesign -T /usr/bin/xcodebuild -T /usr/bin/swift \ -T /Applications/Xcode-15.2.app/Contents/Developer/usr/bin/xcodebuild) security delete-internet-password -a token -s $SERVER -r htps "${KEYCHAIN_NAME}" security add-internet-password -a token \ -s $SERVER \ -w $CODEARTIFACT_AUTH_TOKEN \ -r htps \ -U \ "${AUTHORIZATION[@]}" \ "${KEYCHAIN_NAME}" security set-internet-password-partition-list \ -a token \ -s $SERVER \ -S "com.apple.swift-package,com.apple.security,com.apple.dt.Xcode,apple-tool:,apple:,codesign" \ -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" security find-internet-password "${KEYCHAIN_NAME}"
有关此错误和解决方案的更多信息,请参阅 https://github.com/apple/swift-package-manager/issues/7236