Распространение обновлений для корпоративных приложений на 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
генерируется автоматически):
- Загрузите iExplorer ( http://www.macroplant.com/iexplorer/)
- Подключите ваше устройство
- Удалите все файлы в "Media > Downloads"
- Перезагрузите устройство
Это сбрасывает кеши устройств, теперь вы можете установить приложение как обычно.
Я с той же проблемой. Я воспроизвел это:
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 устройства.
- Если ты хочешь вернуть свои вещи
- Сделайте резервную копию устройства iOS в iTunes перед восстановлением (без Ad-Hoc/ корпоративного приложения)
- После того, как вы полностью восстановили свое устройство, установите приложение Ad-Hoc/ для предприятий.
- Восстановите резервную копию из iTunes
- Теперь вы можете удалить эти 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 снова устанавливаются.