Распространение обновлений для корпоративных приложений на iOS 8

У меня есть корпоративное приложение, которое я распространяю через itms URL:

itms-services://?action=download-manifest&url=itms-services://?action=download-manifest&url=https://$MY_PLIST_URL.plist

На iOS 7 и загрузки, и обновления работают нормально. На iOS 8, однако, я получаю ошибку:

LoadExternalDownloadManifestOperation: Ignore manifest download, already have bundleID: com.mycom.MyApp

В моем списке

<key>bundle-identifier</key>
<string>com.mycom.MyApp</string>
<key>bundle-version</key>
<string>0.2.2</string>

и в моем приложении на iOS 8 я использую версию 0.2.1

13 ответов

Решение

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

Например, в вашем списке

<key>bundle-identifier</key>
<string>com.mycom.MyApp</string>
<key>bundle-version</key>
<string>0.2.2</string>

измените com.mycom.MyApp на com.mycom.MyApp.ios8fix

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

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

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

Как уже заметил Шон, это появляется с xCode 6 GM и официальной версией iOS 8. Устройства, которые никогда не устанавливали ваше приложение, не будут иметь проблем с его установкой.

Это работало лучше для меня, не нужно трогать манифест или другие хитрости (идеально подходит для Xcode Server, где plist генерируется автоматически):

  1. Загрузите iExplorer ( http://www.macroplant.com/iexplorer/)
  2. Подключите ваше устройство
  3. Удалите все файлы в "Media > Downloads"
  4. Перезагрузите устройство

Это сбрасывает кеши устройств, теперь вы можете установить приложение как обычно.

Я с той же проблемой. Я воспроизвел это:

1) Установка моего приложения при обновлении с iOS 7 до iOS 8 GM

2) Удаление его в iOS 8

3) Попытка установить его через itms-сервисы: с тем же именем пакета

Когда я попытался изменить идентификатор пакета в plist сервера (не в приложениях Info.plist), это сработало (приложение было загружено без значка "тень"). Но это похоже на яблочную ошибку.

Принятое решение больше не работает на iOS9.

Насколько я понимаю, Apple закрыла серьезную дыру в безопасности iOS, запретив двоичным файлам adhoc заменять стандартные приложения или приложения, загруженные из App Store. См. Эту статью для справки (CVE-2015-3722/3725 и CVE-2015-3725):

https://www.fireeye.com/blog/threat-research/2015/06/three_new_masqueatt.html

Учитывая последствия для безопасности, я не ожидал бы, что это поведение изменится в будущих версиях IOS. Альтернативные варианты кажутся следующими:

  • удалите версию App Store перед установкой adhoc
  • распространять adhoc как "новое" приложение, изменяя идентификатор пакета как в приложении, так и в списке распространения
  • использовать TestFlight

То, что сказал Гил, кажется правильным, но более конкретно я обнаружил, что мне также нужно увеличить строку версии пакета в server.plist:

    <key>bundle-version</key>
    <string>3.2.2</string>

Это, по крайней мере, позволяет выполнить установку OTA.

(Извините... Я бы добавил к комментариям, но я слишком увлечен.)

Посмотрите на этот ответ и этот ответ.

Вы можете решить эту проблему без каких-либо взломов, для iOS8 вы должны включить в assets ключ манифеста .plist подать display-image а также full-size-image ключи. Они были доступны в Xcode 5 при сохранении архива для корпоративного и дополнительного развертывания, но не были обязательны.

Я создал gist на github с шаблоном для файла install-manifet.plist.

Проблема решена путем изменения идентификатора пакета в plist.

Обычно после нажатия на ссылку itms отображается рабочий стол с иконкой установки. Однако для моего устройства iOS 8.0 после нажатия на ссылку itms она не изменится на страницу установки, но установка уже работает позади.

Эта ошибка впервые обнаружена в iOS8 Beta5. И это все еще не было исправлено Apple в GM seed и официальной версии iOS8.0. Больше обсуждений можно найти здесь

Текущий обходной путь, проверяемый мной самостоятельно:

  • Если вам все равно содержимое вашего устройства: выполните чистое восстановление в режиме DFU устройства.
  • Если ты хочешь вернуть свои вещи
    1. Сделайте резервную копию устройства iOS в iTunes перед восстановлением (без Ad-Hoc/ корпоративного приложения)
    2. После того, как вы полностью восстановили свое устройство, установите приложение Ad-Hoc/ для предприятий.
    3. Восстановите резервную копию из iTunes
    4. Теперь вы можете удалить эти Ad-Hoc/ корпоративные приложения и переустановить их.

Это экстремально, но если вы не можете изменить свой идентификатор пакета, чего я не смог, восстановление вашего iPhone через iTunes до последней версии iOS 8 и восстановление из резервной копии решает проблему.

Та же проблема существует на iOS 10 бета 1.

31 декабря 19:01:32 iphone-6s не работает [98]: LoadExternalDownloadManifestOperation: Игнорировать загрузку манифеста, уже есть bundleID: com.***************. Ios с фазой: SSDownloadPhaseWaiting

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

Обновление: ребята из HockeyApp уведомили Apple об этой проблеме во время WWDC, и исправление должно появиться в следующем семени.

Убедитесь, что у вас есть полный доступ в Интернет.

У меня была такая же проблема с установкой OTA и IOS8. Поскольку я работаю за корпоративным прокси-сервером, приведенные выше решения не работали, пока я не установил ручные настройки прокси-сервера (не нужны в IOS7) для решения этой проблемы.

Я только что столкнулся с этой проблемой на устройстве под управлением 8.1, обновление устройства до 8.3 решило проблему. Так что либо ошибка больше не присутствует в 8.3.... или процесс обновления все равно очистил кэшированные данные.

Если вы создаете свои приложения для iOS с помощью сценария сборки и ранее использовали PackageApplication с флагом --sign, это может вызвать проблемы. Флаг --sign больше не работает при сборке 10.10 и его удалении, после чего все наши приложения для iOS снова устанавливаются.

см.: https://devforums.apple.com/thread/251624?tstart=0

Другие вопросы по тегам