2010-02-02 18 views
12

Tengo una aplicación que he estado desarrollando desde hace algún tiempo. Recientemente, el lanzamiento de la aplicación mediante un doble clic presenta un diálogo que dice "No se puede abrir la aplicación RepoWatch porque puede estar dañada o incompleta".La aplicación no se puede abrir porque falta su ejecutable

Al iniciar la aplicación a través de abierto ./RepoWatch.app me aparece "La aplicación no se puede abrir porque falta su ejecutable".

Normalmente ejecuto la aplicación a través de ./RepoWatch.app/Contents/MacOS/RepoWatch simplemente por puro hábito (lo cual SÍ FUNCIONA), por lo que no estoy seguro de cuánto tiempo ha estado sucediendo esto, o qué cambio sucedió inmediatamente antes de la mano. El cambio más probable es que coloque cp Info.plist ./RepoWatch.app/Contents/ en mi archivo de creación para versionar Info.plist sin versionar todo en el paquete .app.

He consultado Info.plist muchas veces y no encuentro nada incorrecto en él. El archivo se abre con Property List Editor sin ningún error. Guardar desde el Editor de listas de propiedades no hace que el archivo "funcione" (si es culpa suya en primer lugar).

Los permisos por lo que yo puedo decir también buscan cuerdo:

$ ls -l 
./RepoWatch.app/Contents/Info.plist 
[email protected] 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 

Estoy en una pérdida en cuanto a lo que debe probar la próxima.

Y aquí están los contenidos de Info.plist (A pesar de que nada ha cambiado en mucho tiempo):

<?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> 
+0

¿Olvidó incluir la salida de 'ls -l/Applications/Adium.app/Contents/Info.plist', o no quiso incluir ese comando en primer lugar? –

+0

Estaba teniendo problemas con el formateo de ese bloque y se eliminó de alguna manera. Se ha agregado. También eliminé los atributos extendidos de mi archivo y eso no hizo diferencia. –

+0

"... No estoy seguro de cuánto tiempo ha pasado esto, o qué cambio sucedió inmediatamente antes de la entrega". Si su sistema de control de versiones tiene un comando de bisección, ahora sería el momento de usarlo. (Si no está utilizando el control de versiones, esta es una buena demostración de un motivo para hacerlo). –

Respuesta

6

El problema es probablemente debido a un valor no válido en el archivo CFBundleExecutable propertyInfo.plist está copiando en la aplicación.

En proyectos de Xcode, el valor predeterminado para esta propiedad es un valor de variable especial (marcador de posición) (${EXECUTABLE_NAME}) que se expande (reemplaza) cuando el sistema de compilación crea la aplicación. ¿Estás seguro de que necesitas copiar este archivo manualmente? Tal vez pueda agregar una fase de creación de scripts que realice los cambios que necesite después de que se haya expandido y copiado en su lugar mediante el proceso de construcción normal.

Mientras lo hace, debe buscar otros valores de marcador de posición en el archivo. Es probable que deba completar CFBundleName (también pueden ser necesarios otros, según el tipo de aplicación).

+0

No estoy usando XCode. Lo sé, soy un hereje. El CFBundleExecutable no ha cambiado desde que comencé a copiar el archivo. Esa es la respuesta más lógica, pero no puedo encontrar nada que haya hecho que ese valor ahora no sea válido. –

+0

Recuperé esta respuesta, aunque fue inútil. No consideré si el comentario sería útil antes de eliminar la respuesta. –

+1

Esto me sucedió en un sistema de archivos sensible a mayúsculas y minúsculas, donde la propiedad CFBundleExecutable usaba el nombre del ejecutable correcto, pero en mayúscula y el ejecutable en minúscula. Curiosamente, el '.app' funcionaba dentro de su' .dmg' pero no en mi carpeta '/ Applications', lo que sugiere que este' dmg' en particular no era sensible a las mayúsculas y minúsculas. –

2

OK, algunos (más) disparos en la oscuridad.

  1. El docs for LSMinimumSystemVersion decir que el valor se supone que es una cadena con la forma n.n.n. Puede intentar agregar un ".0" hasta el final de su valor.
  2. Cuando usa ./RepoWatch.app/Contents/MacOS/RepoWatch para ejecutarlo manualmente, ¿está utilizando algún tipo de generación de nombre o finalización, o está escribiendo todo (especialmente el nombre del archivo del ejecutable)?
    • Tal vez el nombre de archivo ejecutable tiene algún carácter extraño invisible/combinando/parecido que no coincide con el valor en Info.plist. Pruebe ls -w /path/to/RepoWatch.app/Contents/MacOS/ | xxd para ver los bytes de cualquier cosa que no sea ASCII.
  3. ¿El plutil -lint /path/to/Info.plist le da un "OK"?
  4. El @ después de los permisos en la salida ls -l indica algunos xattrs. Estos podrían ser inofensivos, pero ¿ha mirado cuáles hay con ls [email protected]?
    • Si uno de los xattrs parece sospechoso (o incluso si no) que podría (cd /path/to/RepoWatch.app/Contents/ && mv Info.plist Info.plist.save && cat Info.plist.save > Info.plist) para obtener una copia sin los xattrs y prueba con él.
    • Si el uso del archivo no protegido aún causa problemas, puede intentar modificar y eliminar sistemáticamente las claves (después de hacer una copia de seguridad, como el .save anterior) para ver si puede causar un mensaje de error diferente que podría ayudar a indicar el problema.
+0

Estoy a punto de salir y recién ahora noté las nuevas respuestas. ¿Hay alguna manera de hacer que SO me envíe un correo electrónico con las respuestas? Dejo de mirar esto regularmente después de las primeras 24 horas más o menos. Quité los xattrs. Eso no ayudó. Voy a intentar el resto cuando regrese. Estoy especialmente interesado en el plutil -lint. No conocía ese comando, y estaba asumiendo que el editor de plist me dijera si algo andaba mal. –

+0

De sus sugerencias, lo único que me llamó la atención es algo extraño: $ ls -w ./RepoWatch.app/Contents/MacOS/ | xxd 0000000: 5265 706f 5761 7463 680a RepoWatch. 0a parece ser un salto de línea, y aparece como un punto en el lado derecho. ¿Es solo porque es un número impar de personajes, o es esto realmente un problema? –

+0

Notificaciones: Al hacer una pregunta, hay una casilla de verificación "Notificar _ diariamente _ de nuevas respuestas", ¿es esa opción allí una vez que ha hecho una pregunta (tal vez solo en edición?)? También en su página de perfil (haga clic en su nombre en la parte superior de cualquier) debajo de "preferencias", se encuentra otra casilla de verificación de notificaciones. Consulte http://meta.stackexchange.com/questions/24659/instant-email-alerts-and-notifications y http://meta.stackoverflow.com/search?q=email+new+answers –

1

menú Proyecto> Definir Activo Ejecutable

+0

No estoy usando Xcode. Lo puse en un comentario que se eliminó. Perdón por la confusion. –

11

La reconstrucción de la base de datos Launch Services resuelve este problema para mí.

intente ejecutar el siguiente comando en el terminal:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 
+1

Un efecto secundario de la reconstrucción de la base de datos de Launch Services es que olvida todas las veces que dijo "sí" a "X es una aplicación descargada de Internet. ¿Está seguro de que desea abrirla?". Para probar si 'lsregister' es probable que solucione el problema: Haga una copia de .app. ¿Puedes ejecutar la copia? Si es así, ejecute 'lsregister'. – jlstrecker

+2

Para actualizar la base de datos de Servicios de inicio para su aplicación sin reconstruir toda la base de datos, use la opción '-f': http://stackoverflow.com/a/16546673/162094 –

11

Sobre la base de la respuesta que @smokris colocado:

El problema parece estar relacionado con el registro de la aplicación en la base de datos servicios de lanzamiento. No hay necesidad de reconstruir toda la base de datos. Para forzar-actualizar la entrada para su aplicación (en concreto), utilice lsregister con la opción -f:

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

que estaba teniendo el mismo problema que usted describe, y esto funcionó para mí. Gracias, @smokris!

Cuestiones relacionadas