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

мой сценарий

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

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

моя проблема

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

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

В Вопрос

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

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

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

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

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

10 ответов


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

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

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

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


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

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

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

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


У меня была та же проблема. Вот как я наконец решил эту проблему:--2-->

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

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

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


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

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

#!/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 и отправьте его вам вместе с профилем распространения, с помощью которого вы можете создать дистрибутив App Store для своего клиента.

удачи!!

с уважением, Сэм!--1-->


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

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

Как делать:

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

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

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

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