

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Swift 故障排除
<a name="swift-troubleshooting"></a>

以下信息可能有助于你解决 Swift 和的常见问题 CodeArtifact。

## 即使在配置了 Swift 程序包管理器之后，我在 Xcode 中还是出现了 401 错误
<a name="swift-troubleshooting-xcode"></a>

**问题：**当你尝试将 CodeArtifact 仓库中的软件包作为依赖项添加到 Xcode 中的 Swift 项目时，即使你按照[连接到 Swift 的说明进行操作，也会收到 CodeArtifact](configure-swift.md) 401 未经授权的错误。

**可能的修复方法：**这可能是由存储您的 CodeArtifact 凭据的 macOS 钥匙串应用程序存在问题引起的。要解决这个问题，我们建议打开 Keychain 应用程序并删除所有 CodeArtifact 条目，然后按照中的说明再次使用 CodeArtifact 存储库配置 Swift Package Manager。[配置 Swift Package Manager CodeArtifact](configure-swift.md)

## 由于钥匙串提示输入密码，Xcode 在 CI 计算机上挂起
<a name="swift-troubleshooting-ci-machine"></a>

**问题：**当你尝试从 CodeArtifact 持续集成 (CI) 服务器上的 Xcode 版本中提取 Swift 包时，例如使用 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 仅支持保存在钥匙串中的凭证。要解决这个问题，建议使用以下步骤手动创建钥匙串条目：

1. 准备钥匙串。

   ```
   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}"
   ```

1. 获取 CodeArtifact 身份验证令牌和您的存储库端点。

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \
                                       --region {{us-west-2}} \
                                       --domain {{my_domain}}   \
                                       --domain-owner {{111122223333}}   \
                                       --query authorizationToken  \
                                       --output text`
                                        
   export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint  \
                                 --region {{us-west-2}}   \
                                 --domain {{my_domain}}   \
                                 --domain-owner {{111122223333}}   \
                                 --format swift     \
                                 --repository {{my_repo}}    \
                                 --query repositoryEndpoint   \
                                 --output text`
   ```

1. 手动创建钥匙串条目。

   ```
   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](https://github.com/apple/swift-package-manager/issues/7236)。