Развертывание корпоративного приложения не устанавливается на iOS 8.1.3
8 ответов
После нескольких часов работы со скобками, вот как я это сделал:
ПРИМЕЧАНИЕ. В настоящее время я не проверял это на iOS 8.1.2 или ниже (действуйте с осторожностью!)
Для приложений, которые УЖЕ были подписаны с вашим СОБСТВЕННЫМ корпоративным сертификатом, все, что вам нужно сделать (как упомянуто RAStudios в его редактировании), это отредактировать manifest.plist:
До:
<key>bundle-identifier</key>
<string>uk.co.acme.AcmeApp</string>
После:
<key>bundle-identifier</key>
<string>S836XXACME.uk.co.acme.AcmeApp</string>
Для приложений, которые были подписаны третьей стороной, которую вы подписываете с помощью корпоративного сертификата (в этом пошаговом руководстве предполагается, что файл ipa - это AcmeApp.ipa, ваш файл разрешений - authorlements.plist, а ваш профиль обеспечения - provProvile.mobileprovision; все файлы; находятся в папке Desktop (Mac OSX), а S836XXACME - это идентификатор вашей команды):
Создайте новый файл authorlements.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>S836XXACME.uk.co.acme.AcmeApp</string>
<key>get-task-allow</key>
<false/>
</dict>
</plist>
Разархивируйте ipa:
cd ~/Desktop
unzip AcmeApp.ipa
Удалить подпись кода:
rm -r Payload/AcmeApp.app/_CodeSignature/
Скопируйте в файл mobileprovision:
cp provProfile.mobileprovision Payload/AcmeApp.app/embedded.mobileprovision
CodeSign:
codesign -f -s "iPhone Distribution: ACME Corporation Limited" --entitlements entitlements.plist Payload/AcmeApp.app
Застегните его как ушедший в отставку ipa:
zip -qr AcmeApp_resigned.ipa Payload/
Вам также необходимо изменить файл manifest.plist в соответствии с ранее подписанной частью "УЖЕ":
<key>bundle-identifier</key>
<string>S836XXACME.uk.co.acme.AcmeApp</string>
После расследования..
Изменить: После дальнейшего тестирования я обнаружил, что просто совпадает с идентификатором пакета в Info.plist
и идентификатор пакета в manifest.plist
работал над установкой приложений по беспроводной сети на iOS 8.1.3. Если это решение не работает, попробуйте решение ниже.
Оригинальное решение
Исправить проблему:
Ваша заявка должна иметь действительный entitlements.plist
, который включает в себя правильный действительный идентификатор пакета приложения.
Если вы распространяете приложение, подписанное с помощью сертификата разработки для iOS, то вот пример списка liclements.plist, который вы должны включить в свое приложение.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>com.yourbundleidhere.mycoolapp</string>
<key>com.apple.developer.team-identifier</key>
<string>com.yourbundleidhere.mycoolapp</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>com.yourbundleidhere.mycoolapp</string>
</array>
</dict>
</plist>
Если вы используете подстановочный профиль, замените com.yourbundleidhere.mycoolapp
с yourwildcardappid.*
, В обоих случаях вы можете использовать iResign для правильной отставки приложений и включить требуемый теперь файл rightlements.plist.
Объяснение проблемы
Из-за исправлений безопасности (см. Здесь, под CVE-2014-4493), без файла rightlements.plist приложение не будет установлено. Это исправление безопасности не позволяет приложениям переопределять существующие приложения и устанавливать поверх них / заменять их.
Я провел немало экспериментов с этим. По моему опыту идентификатор пакета в файле manifest.plist на самом деле не так критичен. Самая важная вещь, которую нужно сделать, - это правильно настроить файл rightlements.plist.
Вместо того, чтобы создавать это вручную, я бы порекомендовал сгенерировать его из профиля обеспечения с помощью следующего скрипта ( кредит):
# Create an entitlements file
# parse provision profile
security cms -D -i "provProfile.mobileprovision" > ProvisionProfile.plist 2>&1
# generate entitilements.plist
/usr/libexec/PlistBuddy -x -c "Print Entitlements" ProvisionProfile.plist > Entitlements.plist 2>&1
Затем вы можете использовать этот файл разрешений с параметром --entitlements в утилите codeign.
Я справился с этой проблемой.
- Поскольку Apple изменила профили предоставления, ЗАМЕНИТЕ профили предоставления (Файл 1) и скопируйте его в "Полезные данные /".
- Убедитесь, что в "Payload/" есть Entitlements.plist (файл 2), и этот plist-файл ДОЛЖЕН быть PLAIN TEXT, который создается текстовым редактором.
- Убедитесь, что в "Payload/" есть Info.plist (файл 3), и он создан XCode;
- Скопируйте Entitlements.plist (файл 4) в любое другое место, кроме "Payload/".
- Убедитесь, что "Идентификатор пакета" в файле 1-4 должен быть одинаковым.
- Используйте этот Entitlements.plist (файл 4) для повторной подписи файла IPA.
Вы можете оставить это так
codesign -fs "iPhone Distribution: Your Company Name" --entitlements=/Users/SenTR/Downloads/codesign/Entitlements.plist /Users/SenTR/Downloads/codesign/Payload/Your_Project_name.app
Пример Entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>PREFIX.yourappBundleID</string>
<key>aps-environment</key>
<string>production</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>PREFIX.yourappBundleID</string>
</array>
</dict>
</plist>
Если вы знаете китайский язык, это будет полезно.
В дополнение к ответам @Mark и @RaStudio я видел еще две причины появления сообщения "Невозможно загрузить приложение"; один из которых является новым для iOS 8.1.3.
Новая причина сбоя на iOS 8.1.3
Эта ошибка возникает при попытке установить приложение с просроченным профилем обеспечения. При подписании приложения сертификат и профиль обеспечения должны быть действительными и не иметь срока действия. Похоже, что в некоторых случаях на iOS 8.1.2 может быть установлено приложение с профилем инициализации с истекшим сроком действия и сертификатом с истекшим сроком действия. Убедитесь, что срок действия соответствующего профиля не истек, перейдя в центр разработчиков Apple.
Старая причина отказа
Эта ошибка возникает при попытке загрузить приложение, подписанное сертификатом разработки и профилем обеспечения, если устройство не было добавлено в профиль, обеспечивающий разработку, в центре разработчиков Apple.
У меня та же проблема, и это происходит для приложений, которые не имеют никаких прав.
Повторная подпись приложения с соответствующими правами решила проблему для меня, но это будет проблемой, так как все приложения, которые уже развернуты, должны быть повторно подписаны и развернуты.
Это странная проблема, потому что эти приложения, которые потерпели неудачу для меня, не используют ничего вроде обмена цепочками ключей или push-уведомлений и, следовательно, вообще не нуждаются в правах (согласно моему пониманию). Теперь, когда я просто добавляю права с разделением ключей, оно начинает работать.
Я ответил на это здесь, это сработало для меня без необходимости делать что-либо еще
iOS 8.1.3: внутреннее приложение нужно распространять вместе с MDM.
MobileInstallation
Воздействие. Злонамеренное корпоративное приложение может получить контроль над локальным контейнером для приложений, уже находящихся на устройстве.
Описание. В процессе установки приложения существовала уязвимость. Это было решено путем предотвращения переопределения корпоративных приложений существующими приложениями в определенных сценариях.
из примечания к выпуску Apple