

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Swift 疑難排解
<a name="swift-troubleshooting"></a>

以下資訊可協助您疑難排解 Swift 和 CodeArtifact 的常見問題。

## 即使設定 Swift Package Manager 後，我的 Xcode 中仍出現 401 錯誤
<a name="swift-troubleshooting-xcode"></a>

**問題：**當您嘗試從 CodeArtifact 儲存庫新增套件做為 Xcode 中 Swift 專案的相依性時，即使您已遵循將 [Swift 連線至 CodeArtifact](configure-swift.md) 的指示，也會收到 401 未經授權的錯誤。

**可能的修正：**這可能是因為 macOS Keychain 應用程式的問題所造成，您的 CodeArtifact 登入資料會存放在其中。若要修正此問題，建議您開啟 Keychain 應用程式並刪除所有 CodeArtifact 項目，並依照 中的指示，再次使用 CodeArtifact 儲存庫設定 Swift Package Manager[使用 CodeArtifact 設定 Swift Package Manager](configure-swift.md)。

## 由於密碼的金鑰鏈提示，Xcode 掛在 CI 機器上
<a name="swift-troubleshooting-ci-machine"></a>

**問題：**當您嘗試從 CodeArtifact 提取 Swift 套件作為連續整合 (CI) 伺服器上的 Xcode 組建的一部分，例如使用 GitHub 動作時，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. 手動建立 Keychain 項目。

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