Отправка приложения Ad-hoc в Appstore/iTunesConnect

I знать, как подписать приложение с мобильным обеспечением Appstore и как переписать подписанный Adhoc IPA с помощью мобильного приложения Appstore. Это не мой вопрос.

Мой вопрос: можете ли вы отправить Adhoc-подписанный IPA в Appstore/iTunesConnect и пройти проверку Apple и, в конечном счете, быть распространенным через Appstore. Зачем? Так что мне не нужно хранить избыточный IP-адрес, подписанный Appstore, по каждому подписанному Adhoc кандидату на выпуск IPA и не нужно делать дополнительный шаг для повторной подписи, для которого требуется компьютер Mac.

При использовании Application Loader он может найти все глупые небольшие ошибки, такие как отсутствующие значки и запуска изображений, но даже когда я загружаю Adhoc-подписанный IPA через Application Loader, он не жалуется на мобильное обеспечение не-appstore (что очень легко проверить, как иконы).

Я также обнаружил в своем тестировании, что, когда вы принимаете IPA, подписанную Appstore (которую вы не должны устанавливать на устройствах, если они не распространяются через Appstore), ее можно установить на тестовые устройства, если на устройстве уже есть профиль предоставления Adhoc (тот же AppID, тот же сертификат распространения).

Итак, это заставляет меня думать, что Apple просто удаляет мобильное обеспечение при распространении через Appstore.

Был аналогичный вопрос (закрыт) почти 3 года назад, но OP никогда не предоставлял ответа, если он действительно работал: Представлено приложение appstore с профилем adhoc.

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

Ответ 1

В вашем основном вопросе есть несколько целенаправленных внутренних вопросов, я обращу внимание на каждую часть, когда мы пойдем - как всегда, я буду рад пересмотреть или уточнить, пропустил ли я что-то. Я полагаю, что это только секретный секрет, потому что большая часть аргументов в пользу его работы возвращается к криптографическим деталям как функция инфраструктуры открытого ключа, которая поддерживает подготовку Apple. Этот материал становится очень быстрым, поэтому некоторые считают, что это [Черная магия. Надеюсь, это затмит свет на то, что происходит!

Версия TL, DR

Да, вы можете, но это технически неподдерживаемый прецедент, который может измениться в любое время. Это работает, потому что какая информация, которую iTunes Connect выбирает для проверки, не включает в себя один фактор дифференциации между профилем распределения приложений App Store и AdHoc. Поскольку это технически не разрешенная конфигурация, я бы рекомендовал, по крайней мере, иметь план резервного копирования, поскольку Apple может изменить политику проверки iTunes Connect в любое время, нарушая этот край.

Теперь для любопытных, вот остальная часть истории...

Можете ли вы представить Adhoc-подписанный IPA для Appstore/iTunesConnect и пройти проверку Apple и, в конечном счете, быть распределены через Appstore [?]

С этой конкретной итерацией iTunesConnect и Application Loader (4 сентября 2014 г. /Xcode 5.1.1) да, вы можете отправить подписанную сборку AdHoc и принять ее по конвейеру. Орел-гласный читатель заметит, что мой "Да" поставляется со встроенным выходным люком. Из-за того, что данные, закодированные в профилях подготовки AdHoc vs App Store, почти идентичны в зависимости от того, какие части этих файлов iTunesConnect фактически используют для проверки, профиль предоставления AdHoc предоставляет конвейер доставки так же, как версия AppStore того же приложения.

Если формат резервирования изменяется между файлами AdHoc и App Store, чтобы явно различать два типа профилей предоставления распределений или если инженеры Apple iTunesConnect меняют правила проверки на стороне сервера, совершенно очевидно, что это недокументированное поведение перестанет работать. Конечно, мы все знаем, что мы предполагаем использовать профиль обеспечения App Store в соответствии с документацией разработчика в Руководстве по распределению приложений > Отправка вашего приложения > О профилях резервного хранилища (https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/SubmittingYourApp/SubmittingYourApp.html#//apple_ref/doc/uid/TP40012582-CH9-SW32) [выделено мной]:

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

... но этот другой проспект работает пока. Если вы решите использовать этот путь, вам просто нужно знать, что это не документированное поведение и, следовательно, оно может быть изменено в любой момент времени, вероятно, без предварительного уведомления. Поскольку он обходит края требований к представлению, вероятно, было бы неплохо, если бы у вас была установка плана резервного копирования для случая изменения настроек Apple или требований проверки iTC. Закон Мерфи будет диктовать, что эти проверки будут происходить в самое неподходящее время.

Убираем "Soapbox" "Лучшая практика" и обращаясь к технической стороне вещей...

Почему [это работает]?

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

Связанное чтение: у меня есть более длинный ответ Что такое идентификаторы подписи кода?, который более подробно объясняет части процесс кодирования.

В этом случае возникает вопрос: "Почему профили AdHoc работают, когда в документации указано, что вам нужен профиль в App Store?"

В китах профиля обеспечения содержится криптографически подписанный .plist, который включает информацию, указанную выше, плюс некоторые дополнительные метаданные. На машине OS X вы можете открыть терминал и запустить:

security cms -D -i path/to/AdHoc.mobileprovision

... и в отдельном окне терминала запустите эквивалент профиля App Store:

security cms -D -i path/to/AppStore.mobileprovison

Эти команды выгружают часть plist профиля обеспечения в соответствующие окна терминала. Когда вы просматриваете содержимое обоих окон, вы заметите, что следующие разделы идентичны:

  • AppIDName
  • AppliationIdentifierPrefix
  • DeveloperCertificates
  • Entitlements
  • TeamIdentifier
  • Версия

Метаданные профиля различны, но это полностью ожидаемые различия, которые имеют значение только для проверки достоверности профиля или для людей, опросив профиль:

  • CreationDate
  • ExpirationDate
  • Имя
  • TimeToLive
  • UUID

Отличительными моментами, которые нужно убрать, являются:

  • Блоки DeveloperCertificates идентичны между обоими профилями.
  • Только профиль AdHoc добавляет информацию (ProvisionedDevices) в структуру и формат профиля App Store.

Содержимое массива DeveloperCertificates - это сертификат распространения звука X.509, закодированный DER, - тот же, что и в вашей цепочке ключей. Важно отметить, что данные DER являются только общедоступной частью Распределения сертификата public-private keypair, и его могут использовать только другие, чтобы аутентифицировать подпись приложения, полученную от вас. Это может не используется для выхода из двоичного файла как вы.

Если вы вставляете содержимое элемента DeveloperCertificates: Array: Data в декодер ASN.1 (http://lapo.it/asn1js/) и сравниваете элементы вывода в информацию, закодированную в сертификате распространения, включенном в цепочку ключей, вы обнаружите, что это точная копия общедоступного сертификата Распространение, который вы загрузили из Apple после отправки вашего запроса на подпись сертификата, хотя Сертификаты, Идентификаторы и Профили.

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

Когда Apple выполняет проверку подписи в iTunes Connect во время процесса подачи, как подписанная криптографическая подпись, подписанная AdHoc, так и подписанная криптографическая подпись подписки на приложение Store успешно подтвердят сертификат распространения, который Apple имеет в файле, поскольку оба профиля профилей поддерживаются тем же Сертификат распространения.

Итак, соответствие подписей, но почему дополнительная информация в профилях AdHoc не запускает отправку?

В исходном вопросе вы узнаете, что вы знакомы с политиками установки приложений для iOS. В интересах кого-то, кто наткнется на этот ответ в будущем, я кратко подведу итог:

iOS работает с политикой "запретить все, кроме специально разрешенной". То есть, iOS предполагает, что вам не разрешено устанавливать приложение, если не разрешен конкретный "грант". Для устройств, входящих в App Store, подпись приложения включает идентификатор Apple App Store, для которого у iOS есть специальная привилегия "grant". По умолчанию установки AdHoc подпадают под политику "deny", а раздел ProvisionedDevices профиля Development или AdHoc - это особые привилегии "grant". Приложение будет установлено за пределами App Store, если выполняются следующие условия:

  • Криптографическая подпись приложения действительна
  • Криптографическая подпись профиля встроенного профилирования приложений по-прежнему действительна (профиль не был изменен)
  • Профиль встроенного профилирования приложений ExpirationDate не прошел и текущее время не было до CreationDate
  • Вложенный профиль или профиль, установленные в устройстве, соответствуют предлагаемому для установки AppId.
  • Вложенный профиль или профиль, установленные на устройстве, содержат запись в ProvisionedDevices, которая точно соответствует UDID устройства.

Как мы видели выше, информация о идентификаторе и подписании приложения идентична между профилем App Store и профилем Ad Hoc - добавление ProvisionedDevices служит только для добавления этих привилегий 'grant' для внешнего (вне приложения Store). Оказывается, что проверка iTunes Connect/Application Loader в настоящее время только подтверждает, что для подписи приложения использовался профиль распространения, а не тот профиль, который использовался, был профилем App Store вместо профиля AdHoc.

Это сводится к тому, что с блока версии 1 (ala Version в plist) единственным отличительным фактором между профилями распределения AdHoc и App Store является наличие или отсутствие блока ProvisionedDevices. Оказывается, что на сегодняшний день это не деталь, которую Apple ищет при опросе профиля, который использовался, поэтому двоичный код передает автоматические части проверки приложений. Они определенно проверяют, что AppId в профиле соответствует тому, что заявляет App, что подпись подписи совпадает с тем, что использовалось для подписи двоичных данных, сроков истечения срока действия и любых используемых прав, соответствует тому, что находится в автоматическом сканировании приложения, кроме того к элементам, которые вы указали в своем исходном вопросе (проверка версий между iTunes Connect и инфо.пластом, присутствие иконописи, размеры иконографии и т.д.)

Гипотетически, в следующем обновлении iTunes Connect/Application Loader они могут начать проверку на отсутствие этого ключа в профиле embedded.mobileprovision, который существует в представленном двоичном файле и автоматически отклонить заявку на том основании, что профиль App Store не использовался. Аналогичным образом, если формат профиля обеспечения был обновлен (например, версия = 2), они могли бы добавить новый элемент, который явно вызывает тип профиля и автоматически отклоняется, если он не является типом App Store. Возможно, это может выглядеть так:

<key>ProfileType</key>
<integer>1</integer>

В тех случаях, когда целочисленное значение может быть 1, 2 или 3 в зависимости от типа используемого профиля, согласуется с форматами, используемыми в таких вещах, как Info.plist, для идентификации поддерживаемых семейств устройств (только для iPhone, только для iPad или Universal). Это прояснит другие вопросы, которые были заданы для определения типа сборки.

Связанное чтение:

Итак, это заставляет меня думать, что Apple просто удаляет мобильное обеспечение при распространении через Appstore.

Да, да! Если вы посмотрите на архивные версии приложений, которые вы отправили, вы обнаружите, что содержимое приложения содержит embedded.mobileprovision - если вы затем загрузите ту же версию из App Store, вы обнаружите, что этот файл отсутствует. Apple использует только встроенное .mobileprovision для проверки содержимого вашего приложения в процессе подачи и просмотра. Когда приложение "Обработка для магазина приложений", окончательный пакет собирается и встроенный профиль удаляется.