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


мой сценарий

Я написал приложение iOS для клиента. Проект почти закончился, и теперь пришло время для них, чтобы положить его в App Store. Я отправлял им сборки разработки на протяжении всего процесса разработки. Эти сборки имели идентификатор пакета на основе моей компании и проекта моего клиента следующим образом:com.mycompany.clientname.projectname. Я подписал эти нерегламентированные сборки с помощью специального профиля подготовки распространения, созданного в моей собственной учетной записи портала подготовки.

теперь что пришло время перейти в магазин приложений, мне нужно сделать сборку выпуска и отправить ее для них, чтобы подписать с их собственным профилем подготовки дистрибутива App Store. Это также подразумевает установку нового идентификатора пакета для проекта.

моя проблема

мне нужно получить скомпилированное приложение для клиента, чтобы они подписались со своим профилем подготовки. Однако мне нужно установить идентификатор пакета на то, что они собираются использовать в первую очередь. Допустим это com.bestclientever.appname. Xcode 4 не позволит мне архивировать проект теперь, потому что для этого требуется подпись кода. Я не могу подписать его кодом, потому что я не могу создать профиль подготовки с тем же идентификатором пакета, что и то, что они настроили на своем портале подготовки (портал подготовки обеспечивает уникальность-как и должно).

я сделал какие-либо неправильные предположения или недоразумения здесь? то есть. Мне действительно нужно установить идентификатор пакета на то, что они собираются подписать?

В Вопрос

есть ли способ архивировать или иным образом создавать приложение iOS без подписи кода? Как "войти позже" или что-то?

или есть ли способ построить приложение с одним идентификатором пакета, но затем кто-то другой сможет подписать его с помощью профиля подготовки для другого идентификатора пакета (либо изменив идентификатор пакета скомпилированного приложения, либо какой-либо другой метод подписи)?

как я могу построить окончательный релиз сборки, но есть кто-то еще подпишите приложение для распространения в App Store?

что я пробовал или искал

  • действуя для клиента.
    • С другими, менее подкованными клиентами, я закончил тем, что просто получил их учетные данные Provisioning Portal и iTunesConnect и просто сделал окончательную сборку как они. Это не будет летать с этим клиентом. Это большая компания со строгими правилами безопасности и большим количеством бюрократии.
  • спуфинг в качестве клиента.
    • это похоже на приведенное выше и не будет работать по тем же причинам. Это звучит очень подозрительно, чтобы спросить моего клиента "можете ли вы экспортировать свой частная ключи и отправить их мне"? Этот метод описан в этом ответе: как я могу отправить приложение iOS клиенту, чтобы они кодировали знак
  • отправка клиенту мой исходный код проекта и позволяя им сделать сборку выпуска.
    • лицензии на исходный код не было наше соглашение. Кроме того, этот клиент не хочет связываться с исходным кодом (следовательно, аутсорсинг). Я бы принял это как последнее средство, но должен быть лучший способ!
  • настройка в качестве разработчика уровня администратора в своем Центре разработчиков.
    • к сожалению, только пользователь уровня агента может создать профиль подготовки (насколько я могу судить). Похоже, должен быть способ либо позволить мне создать профиль, который я могу использовать для подписи сборки или создания профиля для меня. Я не могу найти ни одного варианта.
10 64

10 ответов:

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

Это решение, которое я в настоящее время исследую для своих собственных целей (не полностью протестировано):

вам просто нужно получить доступ разработчика (не team agent) к своей учетной записи и создать профиль подготовки разработки, который разрешает вам создавать указанный идентификатор приложения (вам нужно указать идентификатор приложения, потому что он получает составлено в). Затем архивируйте приложение с профилем разработки и поделитесь архивом с вашим клиентом. Затем они могут повторно подписать архив с помощью собственного профиля распространения.

одна сложность заключается в том, что при создании архива с профилем разработчика атрибут права get-task-allow получает значение true, но должен быть установлен в false для распространения, поэтому вам нужно обойти это, установив его вручную ваши права.plist-смотрите мой вопрос здесь:Могу Ли Я архив с сертификатом разработчика, а затем повторно подписать его во время отправки с сертификатом распространения?

Я только что подтвердил на WWDC 2012, что следующий метод работает. Это лучше всего удовлетворяет моим ограничениям небольшого участия клиента, низкого опыта клиента, простого процесса подписания и владения исходным кодом.

  1. клиент приглашает разработчика в свою команду в центре участников в качестве Admin
  2. разработчик принимает приглашение (должны быть в вашей электронной почте)
  3. разработчик открывает организатор Xcode - > вкладка устройства -> профили подготовки и хиты Обновить в правом нижнем углу. Убедитесь, что вы выбрали правильную команду, и вы должны получить несколько новых пунктов.
  4. в Xcode оставьте настройки идентификации подписи кода для их значений по умолчанию (или сбросьте их разработчику iPhone для любого SDK iOS)
  5. архив приложение
  6. в органайзере щелкните правой кнопкой мыши архив и выберите Показать в Finder
  7. отправить .xcarchive файл для вашего клиента
  8. клиент должен иметь установленный Xcode
  9. клиент дважды щелкает по кнопке .xcarchive файл, который должен открыть его в Organizer
  10. клиент нажимает распространять и подписывает приложение со своей идентичностью
  11. прибыль

Это требует, чтобы клиент использовал Центр участников developer.apple.com и использовать Xcode немного (но только организатор!). Если у вашего клиента есть проблемы с техническими возможностями на этом уровне, я рекомендую просто взять на себя и сделать это для них (и взимать за это плату!). Попросите их разработчика логин и пароль и просто действовать от их имени, как если бы Вы были наемным работником.

Ed Примечание: торговля ключами вокруг-это ужасный компромисс, потому что он более технический и вовлеченный для клиента и более взломанный и рискованный для разработчика. Это следует рассматривать как не вариант, учитывая эти два лучших варианта.

У меня была та же проблема. Вот как я, наконец, решил ее:

  1. клиент создал развитие сертификаты.
  2. клиент создал развитие файл подготовки с использованием того же идентификатора приложения, что и файл подготовки распространения.
  3. клиент экспортировал сертификат разработки (.p12).
  4. клиент прислал мне .файл p12 и файл подготовки для мобильных устройств разработки.
  5. I импортировал файл клиентов p12 в мой брелок
  6. я импортировал файл инициализации клиента в Xcode.
  7. установите идентификатор подписи кода для моей конфигурации сборки, чтобы использовать файл подготовки клиента.
  8. Я заархивировал приложение.
  9. Я отправил архив клиенту.
  10. клиент создал свою сборку дистрибутива, подписав приложение своим распределение подготовка файла. (Они распространяли приложение внутренне для тестирования.)

клиент не был так озабочен обмен развитие сертификат, поскольку они будут делиться своим сертификатом распространения.

Я также должен был создать entitlements.plist С "можно отлаживать" (get-task-allow) установите значение нет и ссылайтесь на него в конфигурации сборки (в разделе подпись кода, права подписи кода).

Я считаю, что нашел способ сделать именно то, что вы хотите, я не сделал обширное тестирование или пытался загрузить в магазин приложений, но из тестирования я сделал это, кажется, хорошо. Отставка и добавление моего профиля подготовки работает, поскольку я могу установить его на своих устройствах, определенных в профиле AdHoc, без необходимости ручной установки профиля. Второй тест был я получил iPad и iPhone версию приложения с тем же идентификатором пакета от xCode, сначала я не мог иметь оба в iTunes, но после отставки и изменения идентификатора пакета я смог установить оба. Я также попытался изменить имя приложения, и это тоже сработало, оно появилось на устройстве и в iTunes с новым именем. Ниже приведен мой скрипт, он предназначен для отставки определенного приложения для меня, поэтому профиль и bundleID жестко закодированы. Я переключаюсь между версией приложения для iPhone и iPad, поэтому я добавил Это в качестве параметра в сценарий. Но вы должны быть в состоянии взять принципы, которые у меня есть здесь, и усовершенствовать их для себе.

кишки этого строится на таких статьях, как Дальнейшие приключения в отставке для iOS Из дневника Дэна Dev и очень похож на приложение Эрика Садун подписчик, перечисленных выше. Главным дополнением, которое я сделал, было редактирование информации.плист до отставки.

#!/bin/sh

DestFile="Signed_"
SigningCertName="YOUR DISTROBUTION CERT NAME HERE FROM KEYCHAIN"
AppInternalName="APP NAME FROM INSIDE PAYLOAD FOLDER.app"

echo
echo "Going to take the app  and resign it as $DestFile"
echo

if [ "" = "iphone" ] ; then
        echo "Using iPhone Profile"
        echo
        BundleID="com.YOURCOMPANY"
        ProvProfile="/Users/YOURNAME/Library/MobileDevice/Provisioning Profiles/PROVISIONINGPROFILE.mobileprovision"
elif [ "" = "ipad" ] ; then
        echo "Using iPad Profile"
        echo
        BundleID="com.YOURCOMPANY.ipad"
        ProvProfile="/Users/YOURNAME/Library/MobileDevice/Provisioning Profiles/PROVISIONINGPROFILE_iPad.mobileprovision"
else
        echo "You must enter either iphone or ipad as the second parameter to choose the profile to sign with."
        echo
        exit 1
fi

rm -f Resigned.ipa
unzip -q  -d temparea
cd temparea/Payload
echo "*** Original Signing ***"
echo "************************"
codesign -d -vv $AppInternalName/
cp "$ProvProfile" ./$AppInternalName/embedded.mobileprovision
export EMBEDDED_PROFILE_NAME=embedded.mobileprovision
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate

#Update the Info.plist with the new Bundle ID
sed 's/>ORIGINAL BUNDLEID HERE</>'$BundleID'</' ./$AppInternalName/Info.plist >./$AppInternalName/Info.plist.new
mv -f ./$AppInternalName/Info.plist.new ./$AppInternalName/Info.plist

# this will do a rename of the app if needed
# sed 's/>ORIGINAL APP NAME</>NEW APP NAME</' ./$AppInternalName/Info.plist >./$AppInternalName/Info.plist.new
# mv -f ./$AppInternalName/Info.plist.new ./$AppInternalName/Info.plist

# echo "Hit enter to proceed with signing."
# read TMP
codesign -f -vv -s "$SigningCertName" -i $BundleID $AppInternalName

echo
echo "*** New Signing ***"
echo "*******************"
codesign -d -vv $AppInternalName/
cd ..
zip -r -q ../Resigned.zip .
cd ..
rm -R temparea
mv Resigned.zip $DestFile
echo
echo "New IPA Created, $DestFile"

лучшим альтернативным способом было бы попросить клиента экспортировать свой закрытый ключ сертификата распространения .файл p12 и отправьте его вам вместе с профилем распространения, с помощью которого вы можете создать сборку дистрибутива магазина приложений для своего клиента.

удачи!!

с уважением, Сэм

ОК, нашел способ сделать это без совместного использования профилей подготовки или сертификатов.

идея состоит в том, чтобы вставить этап сборки "run script", чтобы обмануть XCode в подписание приложения, которое он не компилировал, поэтому вы можете отправить скомпилированное (неподписанное) приложение клиенту, а затем их XCode подписывает это приложение с их сертификатом и профилем.

Как делать:

Шаг 1: сделать в Xcode выдаст неподписанные версии .приложение (я буду называть это "Приложение А"). См. раздел "отключение подписи кода" здесь:https://stackoverflow.com/a/10171462/375486

Шаг 2: создайте новый проект Xcode iOS и удалите из него все этапы сборки, которые вы можете, поэтому он создает пустой .файл приложения (я буду называть это "приложение B")

Шаг 3 добавить "запустить скрипт" этап построения проекта Б, который копирует содержимое "приложение" на "приложение Б". В моем случае я использовал это:

cp -r A.app/* "$CODESIGNING_FOLDER_PATH"

Шаг 4: отправить проект" B " XCode для клиента, со всеми необходимыми файлами.

Шаг 5 клиент создает Проект Б. Под капотом XCode запустит команду "run script", а затем подпишет полученное приложение, и клиент получит идеально подписанное приложение.

и вот это :)

iResign довольно хорошо работает.

Это позволяет изменить идентификатор пакета и добавить права при подписании. Вероятно, будет работать для вашего случая.

Это, как говорится, решение xcarchive является более каноническим. Имейте в виду, что совместное использование файла xcarchive дает им dsym.

Если у вас есть какие-либо инструкции отладки #ifdef в коде, убедитесь, что они отключены в сборке, которую вы им даете.

Я был там. Варианты 2 или 3 не может быть и речи. Вариант 4 был бы идеальным, но, как вы написали, Apple не позволит агенту делегировать свои привилегии для создания профилей распространения.

Так что, по сути, единственный вариант для вас, чтобы получить профиль распределения определяется с их учетом. Чтобы справиться с этим, вам нужно будет войти в систему как их агент, что не является опцией.

Так они придется это сделать. Там нет никакого способа обойти что.

Они также должны будут пригласить вас в качестве члена своей команды разработки продукта на их счет. Вам нужно будет быть администратором. Это означает, что вам придется отправить запрос на сертификат подписи, как указано Apple.

наконец, они должны будут загрузить и отправить вам профили подготовки распределения, которые они создали.

со всем этим вы сможете подписать свое приложение со своими ресурсами.

Я только что говорил по телефону с Apple. Говорят, это единственный способ сделать это: https://developer.apple.com/library/ios/#qa/qa1763/_index.html

клиент добавляет вас в свою команду, и дает вам определенные привилегии.

ха, все это выглядит намного сложнее, чем они должны. Я использую это это:

xcodebuild -scheme "$SCHEME" clean archive \ 
           -archivePath "build/$SCHEME" \
           -workspace $PRODUCT_NAME.xcworkspace \
           -allowProvisioningUpdates \ 
           -configuration Release \
           PRODUCT_NAME="$SCHEME" \ 
           PRODUCT_BUNDLE_IDENTIFIER="$BUNDLE_ID" \
           EXECUTABLE_NAME="$SCHEME" \ 
           DISPLAY_NAME="$DISPLAY_NAME" \
           CODE_SIGN_IDENTITY="" \ 
           CODE_SIGNING_REQUIRED=NO \ 
           CODE_SIGN_ENTITLEMENTS="" \
           CODE_SIGNING_ALLOWED=YES