Подтвердить что ты не робот

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

Мой сценарий

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

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

Моя проблема

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

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

Вопрос

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

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

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

Что я пробовал или изучал

  • Действует для клиента.
    • С другими, менее подкованными клиентами, я закончил тем, что получил только свой Provisioning Portal и ITunesConnect, а также выполнил окончательную сборку. Это не будет летать с этим клиентом. Это крупная компания со строгими рекомендациями по безопасности и много волокиты.
  • Подменю как клиент.
  • Отправка клиенту моего исходного кода проекта и возможность его создания.
    • Лицензия на исходный код не была в нашем соглашении. Кроме того, этот клиент не хочет вмешиваться в исходный код (следовательно, его аутсорсинг). Я хотел бы принять это как вариант последнего курорта, но там должен быть лучший способ!
  • Настройка в качестве разработчика на уровне администратора в Центре разработчиков.
    • К сожалению, только пользователь на уровне агента может создать профиль Provisioning Profile (насколько я могу судить). Похоже, что должен быть способ разрешить мне создать профиль, который я могу использовать для подписи сборки или создания профиля для меня. Я не могу найти ни одного варианта.
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

  • Клиент приглашает разработчика в свою группу в Центре-члене как Admin
  • Разработчик принимает приглашение (должно быть в вашем письме)
  • Разработчик открывает Xcode Organizer → вкладка Devices → Provisioning Profiles и hits Refresh в правом нижнем углу. Убедитесь, что вы выбрали правильную команду, и вы должны получить несколько новых предметов.
  • В Xcode оставьте настройки идентификатора подписи кода до значений по умолчанию (или reset для iPhone Developer для любого SDK для iOS).
  • Архивировать приложение
  • В Organizer щелкните правой кнопкой мыши архив и выберите Show in Finder
  • Отправьте файл .xcarchive на ваш клиент
  • Клиент должен установить Xcode
  • Клиент дважды щелкает файл .xcarchive, который должен открыть его в Organizer
  • Клики кликов Распространяют и подписывают приложение со своей личностью
  • Profit

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

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

Ответ 3

У меня была та же проблема. Так я окончательно решил это:

  • Клиент создал сертификат разработки.
  • Клиент создал файл обеспечения разработки, используя тот же идентификатор приложения, что и файл обеспечения распространения.
  • Клиентский сертификат разработки, экспортированный клиентом (.p12).
  • Клиент отправил мне файл .p12 и файл подготовки к разработке мобильных устройств.
  • Я импортировал клиентский файл p12 в свой брелок
  • Я импортировал файл обеспечения клиента в Xcode.
  • Задайте код подписи Identity для моей конфигурации сборки, чтобы использовать файл подготовки клиента.
  • Я архивировал приложение.
  • Отправил архив клиенту.
  • Клиент создал свою сборку, подписав приложение с помощью файла распространения. (Они распространяли приложение внутри для тестирования.)

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

Мне также пришлось создать entitlements.plist с "Можно отлаживать" (get-task-allow) установить значение "НЕТ" и ссылаться на него в конфигурации сборки (в разделе "Подписание кода", "Права на подпись кода" ).

Ответ 4

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

Взаимосвязь этого основывается на таких статьях, как Дальнейшие приключения в отставке для iOS из Dan Dev Diary и очень похожи на Erica Sadun App Signer, перечисленные выше, Основное дополнение, которое я сделал, это редактирование Info.plist до выхода в отставку.

#!/bin/sh

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

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

if [ "$2" = "iphone" ] ; then
        echo "Using iPhone Profile"
        echo
        BundleID="com.YOURCOMPANY"
        ProvProfile="/Users/YOURNAME/Library/MobileDevice/Provisioning Profiles/PROVISIONINGPROFILE.mobileprovision"
elif [ "$2" = "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 $1 -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"

Ответ 5

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

Желаем удачи!!

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

Ответ 6

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

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

Как это сделать:

Шаг 1: сделайте XCode сгенерируйте unsigned Release.app(я буду называть это "приложение А" ). См. "Отключить подписание кода" здесь: fooobar.com/questions/20391/...

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

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

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

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

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

И что это:)

Ответ 7

iResign работает достаточно хорошо.

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

Говоря это, решение xcarchive является более каноническим. Имейте в виду, что обмен файлом xcarchive дает им dsym.

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

Ответ 8

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

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

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

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

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

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

Ответ 9

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

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

Ответ 10

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

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