Приложение не может быть открыто, потому что его исполняемый файл отсутствует - PullRequest
13 голосов
/ 02 февраля 2010

У меня есть приложение, которое я разрабатывал в течение некоторого времени. При недавнем запуске приложения с помощью двойного щелчка открывается диалоговое окно, в котором говорится: «Вы не можете открыть приложение RepoWatch, поскольку оно может быть повреждено или неполноценно».

Запуск приложения через open ./RepoWatch.app дает мне сообщение «Невозможно открыть приложение, так как отсутствует его исполняемый файл».

Я обычно запускаю приложение через ./RepoWatch.app/Contents/MacOS/RepoWatch просто по привычке (что работает), поэтому я не уверен, как долго это происходило, или какие изменения произошли непосредственно перед этим. Наиболее вероятным изменением является то, что я поместил cp Info.plist ./RepoWatch.app/Contents/ в свой make-файл, чтобы версия Info.plist не поддерживала все версии в комплекте .app.

Я много раз просматривал Info.plist и не могу найти в нем ничего плохого. Файл открывается в редакторе списка свойств без каких-либо ошибок. Сохранение из редактора списка свойств не заставляет файл «работать» (если он виноват в первую очередь).

Разрешения, насколько я могу судить, также выглядят вменяемыми:

$ ls -l
./RepoWatch.app/Contents/Info.plist
-rw-rw-r--@ 1 dgrace  staff  789 Feb  1 23:20 ./RepoWatch.app/Contents/Info.plist
$ ls -l
/Applications/Adium.app/Contents/Info.plist
-rw-rw-r--  1 dgrace  staff 5750 Aug 21 15:41 /Applications/Adium.app/Contents/Info.plist

Я не знаю, что делать дальше.

А вот содержимое Info.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>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>RepoWatch</string>
    <key>CFBundleIdentifier</key>
    <string>com.doomstick.RepoWatch</string>
    <key>CFBundleName</key>
    <string>RepoWatch</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0.0</string>
    <key>LSMinimumSystemVersion</key>
    <string>10.6</string>
    <key>CFBundleVersion</key>
    <string>Beta26</string>
    <key>NSMainNibFile</key>
    <string>MainMenu</string>
    <key>NSPrincipalClass</key>
    <string>NSApplication</string>
</dict>
</plist>

Ответы [ 5 ]

12 голосов
/ 14 мая 2013

Опираясь на ответ, который @smokris разместил:

Кажется, проблема в регистрации вашего приложения в базе данных Launch Services. Нет необходимости перестраивать всю базу данных. Чтобы принудительно обновить запись для вашего приложения (в частности), используйте lsregister с параметром -f:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f MyApp.app

У меня была та же проблема, которую вы описали, и это сработало для меня. Спасибо, @smokris!

11 голосов
/ 30 января 2013

Перестройка базы данных Launch Services решает эту проблему для меня.

Попробуйте выполнить следующую команду в терминале:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
6 голосов
/ 02 февраля 2010

Вероятно, проблема связана с неверным значением CFBundleExecutable свойства в файле Info.plist, который вы копируете в приложение.

В проектах XCode значением по умолчанию для этого свойства является значение специальной переменной (заполнителя) (${EXECUTABLE_NAME}), которое раскрывается (заменяется) при сборке приложения системой сборки. Вы уверены, что вам нужно скопировать этот файл вручную? Возможно, вы можете добавить фазу сборки скрипта, которая вносит любые необходимые изменения после , когда он был развернут и скопирован на место обычным процессом сборки.

Пока вы это делаете, вам следует проверить другие значения заполнителя в файле. Вполне вероятно, что вам нужно будет заполнить CFBundleName (могут потребоваться и другие, в зависимости от типа вашего приложения).

2 голосов
/ 05 февраля 2010

ОК, несколько (больше) снимков в темноте.

  1. Документы для LSMinimumSystemVersion говорят, что значение должно быть строкой в ​​форме n.n.n . Вы можете попробовать добавить «.0» в конец значения.
  2. Когда вы используете ./RepoWatch.app/Contents/MacOS/RepoWatch, чтобы запустить его вручную, используете ли вы какой-либо вид завершения или генерации имени файла, или вы все это вводите (особенно имя исполняемого файла)?
    • Возможно, исполняемое имя файла содержит какой-то странный невидимый / комбинирующий / похожий символ, который не соответствует значению в Info.plist. Попробуйте ls -w /path/to/RepoWatch.app/Contents/MacOS/ | xxd посмотреть в байтах что-нибудь не-ASCII.
  3. Дает ли plutil -lint /path/to/Info.plist «ОК»?
  4. @ после разрешений в выводе ls -l указывает на некоторые xattrs. Они могут быть безвредными, но вы смотрели, какие из них с ls -l@?
    • Если один из xattrs выглядит подозрительным (или даже если нет), вы можете (cd /path/to/RepoWatch.app/Contents/ && mv Info.plist Info.plist.save && cat Info.plist.save > Info.plist) получить копию без xattrs и проверить ее.
    • Если использование файла не-xattr все еще вызывает проблемы, вы можете попытаться систематически изменять и удалять ключи (после создания резервной копии, например, .save выше), чтобы проверить, не можете ли вы вызвать другое сообщение об ошибке, которое может помогите указать проблему.
1 голос
/ 05 февраля 2010

Меню проекта> Установить активный исполняемый файл

...