CLI: Переключить брелки для подписи xcodebuild

Я пытаюсь включить определенную цепочку ключей и закрыть другую. Мне нужно это, потому что имена наших предприятий и AppStore называются одинаковыми.

В настоящее время я делаю "разблокировку ключей безопасности", за которым следует "ключ безопасности по умолчанию", чтобы открыть правильный брелок и сделать "брелок безопасности" в цепочке ключей, которую я не хочу использовать.

Но xcodebuild все еще видит записи в обеих цепочках ключей и отказывается.

iPhone Distribution: Company name.: ambiguous (matches "iPhone Distribution: Company name." in /Users/user/Library/Keychains/login.keychain and "iPhone Distribution: Company name" in /Users/user/Library/Keychains/enterprise.keychain)

Как я могу предотвратить обнаружение системой записи в цепочке ключей, которую я заблокировал?

Ответ 1

Решение: Я поместил все материалы, связанные с appstore, в брелок для входа в систему и материал предприятия в отдельном файле keychain.

В buildscript я переключаюсь между ними следующим образом:

    # 1. Only activate the System and either the Appstore(=login) or Enterprise keychain.
security list-keychains -s $KEYCHAIN_NAME $SYSTEM_KEYCHAIN

# 2. Loop through App Schema's
for APP_SCHEME in ${APP_SCHEMES[@]}; do
    echo "--=  Processing $APP_SCHEME  =--"
    xcodebuild -scheme "${APP_SCHEME}" archive
done ### Looping through App Schema's

# 3. Restore login & system keychains
security list-keychains -s $APPSTORE_KEYCHAIN $ENTERPRISE_KEYCHAIN $SYSTEM_KEYCHAIN

Ответ 2

Вы можете указать Xcode, какой брелок использовать:

xcodebuild "OTHER_CODE_SIGN_FLAGS=--keychain '$PATH_TO_KEYCHAIN'"

Или, если вы вызываете codesign напрямую:

codesign --keychain "$PATH_TO_KEYCHAIN"

Если вы используете PackageApplication, установить этот способ не существует. Однако PackageApplication - довольно простой script, который может быть переопределен при необходимости (очень полезно, если вы интегрируетесь с более крупной системой/script).

Ответ 3

Другое решение для xcode версии 6 и ниже: укажите свой сертификат по SHA1 вместо (неоднозначного) имени. Из "man codeign":

 If identity consists of exactly forty hexadecimal digits, it is instead
 interpreted as the SHA-1 hash of the certificate part of the desired iden-
 tity.  In this case, the identity subject name is not considered.

И из "help help find-certificate"

-Z  Print SHA-1 hash of the certificate

К сожалению, для этого метода требуется использовать PackageSign script, который был устарел в Xcode 7