Не удается запустить приложение на симуляторе после установки Xcode 11 - ошибка CFBundleVersion
Вчера я скачал бета-версию Xcode 11. После этого я открыл свой проект и попытался запустить с новым Xcode. К сожалению, произошла ошибка с сообщением:
Failed to install the requested application
Domain: NSPOSIXErrorDomain
Code: 22
Failure Reason: The application CFBundleVersion is invalid.
Recovery Suggestion: Ensure your bundle contains a CFBundleVersion with a valid semantic version number.
--
Я закрыл бета-версию и попытался запустить снова с последней стабильной версией Xcode (10.2.1), но возникла та же ошибка. Я должен упомянуть, что до того, как попытаться запустить проект с Xocde 11, он без проблем работал на Xcode 10. Ничего не изменилось до и после запуска с бета-кодом Xcode.
Что я уже пробовал:
- Я удалил бета-версию Xcode 11
- Я очистил свой проект и вытащил его из последней ветки
- Я полностью удалил Xcode 10 из:
~/Library/Caches/com.apple.dt.Xcode
~/Library/Developer
~/Library/MobileDevice
~/Library/Preferences/com.apple.dt.Xcode.plist
/Library/Preferences/com.apple.dt.Xcode.plist
/System/Library/Receipts/com.apple.pkg.XcodeExtensionSupport.bom
/System/Library/Receipts/com.apple.pkg.XcodeExtensionSupport.plist
/System/Library/Receipts/com.apple.pkg.XcodeSystemResources.bom
/System/Library/Receipts/com.apple.pkg.XcodeSystemResources.plist
- А потом установил свежую стабильную версию 10.2.1
Я могу запустить другие проекты, которые не были протестированы с Xcode 11 без каких-либо проблем.
Моя последняя идея - просто переустановить macOS, но я бы не хотел этого делать.
Изменение: я забыл упомянуть, что приложение работает на физическом iPhone XS.
Ответы
Ответ 1
Здесь много неверной информации, поэтому я хотел дать авторитетный ответ.
Проблема здесь в том, что новая версия CoreSimulator.framework с бета-версией Xcode 11 выполняет проверку CFBundleVersion, чего не делали предыдущие версии. Эти проверки действительны, и они представляют проблему в вашем приложении, но есть также ошибка в том, как проверки были выполнены в Xcode 11 Beta 1, которая усугубляет проблему.
Во-первых, исправьте CFBundleVersion в вашем Info.plist. Он должен состоять только из цифр и не более двух периодов (т.е. ##. [. ## [. ##]], например: 12.4.2).
Во-вторых, после исправления CFBundleVersion вам необходимо killall -9 CoreSimulatorBridge
потому что, к сожалению, старое значение кэшируется в CoreSimulatorBridge, не позволяя ему распознать новое значение. Эта часть была ошибкой, и она была исправлена в Xcode 11 Beta 2.
Ответ 2
Со мной тоже случилось, почти весь день потраченный на поиски возможных причин.
Шаги, которые окончательно решили проблему и позволили мне установить на симуляторе:
- Выйдите из Xcode и iOS Simulator
- Удалите
/Library/Developer
(тот, что из корня), или переименуйте его, если вы хотите сохранить резервную копию - Перезапустите Xcode, согласитесь с установкой инструментов командной строки
- Продолжайте работать там, где вы остались :)
Помимо шагов, упомянутых в вопросе (полная деинсталляция Xcode 11, полная деинсталляция Xcode 10 и последующая переустановка после этого), я также пытался клонировать проект в другом месте, проходя через все возможные места для получения производных данных, устанавливая другие среды выполнения симулятора и пробуя те, Ни один из них не сработал, к счастью, приложение журнала консоли показало путь для процесса, который отклонил пакет приложения, это был один из двоичных файлов, установленных Xcode в /Library/Developer/PrivateFrameworks/CoreSimulator.framework
.
Похоже, Xcode 11 установил более новую версию фреймворков, а Xcode 10 не перезаписывал их. Удаление всей папки /Library/Developer
вызвало установку инструментов командной строки, что в конечном итоге вернуло время выполнения симулятора, которое правильно работало в Xcode 10.
Вы должны любить бета-версии :)
Ответ 3
У меня такая же проблема. Я нахожу, что примечания к выпуску бета-версии Xcode 11 объясняли это.
Bundles without a CFBundleVersion are invalid and cant be properly installed on
devices or simulators. CoreSimulator now checks and rejects such bundles earlier in
the process with a clearer error message. (49892531)
И эта ссылка является форматом CFBundleVersion.
Когда я решил эту проблему, я обнаружил, что возникла проблема с CFBundleVersion при первом запуске приложения. Тогда это всегда имеет проблему, независимо от того, правильный формат или нет. Поэтому я перезапускаю Xcode и Simulator, и меняю CFBundleVersion на правильный формат, приложение работает правильно.
Ответ 4
Сочетание Sgeven.Zheng и Cristik ответов.
ПРИЧИНА
При установке Xcode11 Beta устанавливается новая версия CoreSimulator.framework
со следующим обновлением:
https://developer.apple.com/documentation/xcode_release_notes/xcode_11_beta_release_notes
"Пакеты без CFBundleVersion недействительны и не могут быть правильно устанавливается на устройства или тренажеры. CoreSimulator теперь проверяет и отклоняет такие пакеты ранее в процессе с более ясной ошибкой сообщение. (49892531) "
Следующее не решит проблему:
- Удаление Xcode11 Beta
- Удаление и переустановка Xcode 10
Это связано с тем, что CoreSimulator.framework
установлен в /Library/Developer/PrivateFrameworks/CoreSimulator.framework
, который находится за пределами пакета Xcode.app
.
При повторной установке xcode10 обнаруживает, что установленная на данный момент версия CoreSimulator.framework
новее, чем установила xcode10, поэтому оставляет все как есть.
КРАТКОСРОЧНОЕ ИСПРАВЛЕНИЕ
- Удалить xcode11
- Установите Xcode 10 (не нужно переустанавливать, если он уже установлен)
- Удалить
/Library/Developer/PrivateFrameworks/CoreSimulator.framework
- Запустите Xcode 10 и согласитесь установить инструменты командной строки
ДОЛГОСРОЧНОЕ ИСПРАВЛЕНИЕ
Поскольку это не "настоящая" ошибка, а предполагаемое поведение Xcode11, в конечном итоге необходимо будет предпринять шаги, чтобы гарантировать, что приложения всегда создаются с допустимым CFBundleVersion
.
Ответ 5
Это новая функция в Xcode11.
В примечании к выпуску сказано:
Пакеты без CFBundleVersion недействительны и не могут быть правильно установлены на устройствах или симуляторах. CoreSimulator теперь проверяет и отклоняет такие пакеты ранее в процессе с более ясным сообщением об ошибке. (49892531)
Вы можете:
- Отредактируйте свой CFBundleVersion по стилю этой ССЫЛКИ
- Сбросьте свой Xcode и симулятор
- Запустите снова, вы увидите, что снова работает
Когда вы запустите приложение в симуляторе успеха, вы можете снова изменить свой CFBundleVersion, вы обнаружите, что он все еще может работать XD
Ответ 6
Добавляя к этому, я заметил, что если ваш CFBundleVersion не указывает на:
This key is a machine-readable string composed of one to three period-separated integers, such as 10.14.1. The string can only contain numeric characters (0-9) and periods.
это не будет основываться на симуляторе
ссылка на сайт
Ответ 7
В моем случае это была версия симулятора /coresimulator для 11 бета по сравнению с версией для 10.1 → Убить и позволить Xcode снова открыть симулятор, что решило проблему.
Ответ 8
Я столкнулся с этой же проблемой.
Я не дошел до того, чтобы попробовать некоторые другие опции, представленные здесь, но я смог вернуться к сборке для симулятора, просто удалив каталог /DerivedData.
Если вы не знаете, где его найти, просто сделайте это: Xcode → Preferences → Locations и выберите стрелку рядом с путем для производных данных
Ответ 9
Как сказал Итан Ван, это новая функция в Xcode 11 CoreSimulator. Я попробовал несколько вещей, в то числе очистки сборки, полностью удалить Xcode 11 (и связанные с ним файлы/кэш/файлы имитатор), переустановкой Xcode 10.2.1 и такого, но что сработало для меня была замена Simulator.app в Applications/Xcode /Contents/Developer/Applications
с предыдущими версиями симулятора приложений.
Это, вероятно, ошибка, и, возможно, скоро будет лучшее решение, но это сработало для меня как краткосрочное решение. Не пытайтесь переустановить macOS, просто загрузите предыдущую версию Simulator и замените файл Simulator.app во время работы Xcode 10.2.1.
Ответ 10
В моем случае поле "Версия сборки" на моей цели было пустым, я изменил его на 1, и приложение смогло установить.
Ответ 11
В моем случае поле Build Version было пустым. Я добавил ценность там, но все равно это не сработало. Я попробовал команду killall -9 CoreSimulatorBridge
, и это тоже не помогло.
Наконец, когда я проверил XML файл info.plist (Открыть как → Исходный код), ключ CFBundleVersion отсутствовал, а версия была отображена в info.plist через CFBundleShortVersionString.
Я только что добавил ключ CFBundleVersion, как указано ниже в info.plist, и это сработало.
<key>CFBundleVersion</key>
<string>$(MARKETING_VERSION)</string>
Я надеюсь, что это помогает кому-то еще.