2 votos

Cambiar el ícono de la aplicación con un script

En Sonoma 14.5. Tengo algunas aplicaciones a las que quiero establecer un icono personalizado. Es bastante fácil de hacer en Finder: haga clic derecho en la aplicación, elija obtener información y arrastre y suelte el icono que deseo en el icono de la ventana de obtener información. Sin embargo, cuando la aplicación se actualiza, el icono vuelve al predeterminado y esto tiene que hacerse de nuevo. Obviamente quiero automatizar esto.

Intenté una aplicación llamada Pictogram pero no parece estar funcionando. No aparecen aplicaciones. Intenté usar la terminal para copiar el icono en la carpeta de recursos de la aplicación pero obtuve un permiso denegado, incluso con sudo.

Finalmente, intenté abordar esto en Applescript, usando variaciones de esto

tell application "Finder"
    -- pseudocódigo
    set icon of  to 
end tell

pero no pude hacer que funcionara. Finalmente, recurrí a la escritura de interfaz de usuario. Básicamente repliqué el arrastrar y soltar el icono en la ventana de obtener información en el código. La función está a continuación. Copia el icono al portapapeles, abre la ventana de obtener información de la aplicación, mueve el enfoque al icono, presiona cmd+v para pegar, luego actualiza el dock.

    -- Función para establecer el icono de una aplicación dada
    on setAppIcon(appPath, iconPath)
        -- Convertir rutas POSIX a referencias de archivo de Finder
        set appFile to POSIX file appPath as alias
        set iconFile to POSIX file iconPath as alias

        -- Verificar si la aplicación existe
        tell application "Finder"
            if not (exists appFile) then
                display notification "Aplicación no encontrada: " & appPath with title "Replicons"
                return false
            end if
        end tell

        -- Verificar si el archivo de icono existe
        tell application "Finder"
            if not (exists iconFile) then
                display notification "Archivo de icono no encontrado: " & iconPath with title "Replicons"
                return false
            end if
         0 entonces
    -- Reiniciar el Dock para actualizar los iconos
    do shell script "killall Dock"
    mostrar diálogo "Se reemplazaron correctamente " & (éxito como cadena) & " iconos." botones {"OK"} botón predeterminado "OK"
sino
    mostrar diálogo "No se hizo ningún cambio."
fin si

Esto es torpe. ¿Puedo hacerlo mejor?

Gracias de antemano

1voto

wch1zpink Puntos 11

La siguiente solución no es exactamente lo que estás buscando, pero creo que es suficiente para orientarte en la dirección correcta.

El siguiente código de AppleScript utiliza la utilidad de script de shell fileicon. Si fileicon no está instalado en tu sistema, se puede instalar fácilmente en Terminal.app con Homebrew usando el comando Brew install fileicon

Todo sobre Homebrew

Todo sobre fileicon

activate
set chosenApp to quoted form of POSIX path of (choose file with prompt ¬
    "Elegir la aplicación cuyo icono te gustaría cambiar" of type "APPL")

activate
set iconFile to quoted form of POSIX path of (choose file of type "com.apple.icns" with prompt ¬
    "Elegir el archivo .icns de reemplazo")

try
    do shell script "/usr/local/bin/fileicon rm " & chosenApp
end try

try
    set theResult to do shell script "/usr/local/bin/fileicon set " & chosenApp & " " & iconFile
on error errMsg number errNum
    return
end try

activate
display dialog theResult buttons {"OK"} default button "OK"

ALGUNAS COSAS A TENER EN CUENTA:

  1. La utilidad fileicon no está limitada solo al uso de archivos ".icns".
  2. Asegúrate de usar la ruta correcta para tu instalación de fileicon, en los comandos de do shell script.
  3. Esta versión no modifica el paquete de la aplicación. También agrega el archivo Icon? al directorio base.

enter image description here

1voto

red_menace Puntos 111

No debes alterar archivos en un paquete de aplicación, ya que eso podría romper la firma del código. Además, el diccionario de scripts del Finder muestra la propiedad icon como un mapa de bits, por lo que necesitarías generar los datos para eso.

Establecer un icono para una carpeta (como un paquete de aplicación) agrega un archivo Icon\r al directorio base, lo que no cambia ninguno de los archivos, por lo que se puede usar algo de AppleScriptObjC para el método setIcon:forFile:options: de NSWorkspace. Probé el siguiente script con algunas aplicaciones de las que soy propietario, pero aún necesitarías acceso administrativo para otros elementos en la carpeta /Applications. Mantener presionada la tecla de opción al ejecutar el script eliminará el icono personalizado:

use framework "Foundation"
use scripting additions

on run -- ejemplo
   set currentFlags to current application's NSEvent's modifierFlags() as integer
   set mask to current application's NSAlternateKeyMask as integer
   set optionKeyDown to ((currentFlags div mask) mod 2) as boolean
   if optionKeyDown then
      set choicePrompt to "Elegir un archivo para restablecer el icono:"
   else
      set choicePrompt to "Elegir un archivo para establecer el icono:"
   end if
   set theFile to POSIX path of (choose file with prompt choicePrompt)
   if optionKeyDown then
      set image to missing value
   else
      set iconFile to POSIX path of (choose file of type "public.image" with prompt "Elegir un archivo de imagen para el icono:")
      set image to current application's NSImage's alloc()'s initByReferencingFile:iconFile
   end if
   set success to current application's NSWorkspace's sharedWorkspace's setIcon:image forFile:theFile options:0
end run

0voto

Jason Cooper Puntos 41

Usando la respuesta de @wch1zpink , pude llegar a una solución que utiliza el framework Foundation en lugar de la escritura de UI. Hay un inconveniente: funciona cuando se ejecuta en Automator pero no como una aplicación independiente. Para hacerlo así, necesita estar firmado ad hoc (Replicons.app es el nombre de mi aplicación.)

xattr -cr /Applications/Replicons.app && codesign --force --deep --sign - /Applications/Replicons.app

Luego, necesita ser concedido acceso completo al disco manualmente agregándolo a Configuración > Privacidad y seguridad > Acceso completo al disco

Al menos este es el caso en Sonoma 14.5

El script completo

(*
 Este applescript permite configurar de forma masiva iconos personalizados para aplicaciones (o carpetas)
 No puede establecer iconos para aplicaciones de sistema como Safari
   o aplicaciones que no posee como las instaladas desde la App Store
 Probado y funcionando en Sonoma 14.5

 USO: Cree un archivo de texto llamado replicons.cfg en su carpeta de Documentos
 siguiendo este formato

,
,
...

 El icono puede ser de tipo .icns o de un tipo de imagen como .png

 Ejemplo:

/Applications/Google Chrome.app,/Volumes/T7/icons/chrome dark.icns
/Applications/foobar2000.app,/Volumes/T7/Downloads/foobar2000.icns
/Applications/Spotify.app,/Users/me/Documents/icons/Spotify.png

 Para revertir un icono al predeterminado, deje el campo del icono vacío (nota la coma)

/Applications/Spotify.app,

 No deje líneas en blanco o espacios en blanco al principio/final.

 Discusión en Stackexchange
 https://apple.stackexchange.com/questions/473597/change-apps-icon-by-script

 ADVERTENCIA: para ejecutar como una aplicación independiente (en lugar de dentro de Automator), encontré que la aplicación
 tiene que ser firmada

 xattr -cr /Applications/nombredeapp.app && codesign --force --deep --sign - /Applications/nombredeapp.app

 y concedida acceso completo al disco manualmente agregándola a
 Configuración > Privacidad y seguridad > Acceso completo al disco
*)

use framework "Foundation"
use scripting additions

set configFile to (path to home folder as text) & "Documents:replicons.cfg"

-- Función para configurar el icono de una aplicación determinada
on setAppIcon(appPath, iconPath)
    try
        -- la magia sucede aquí
        if iconPath is "" then
            set image to missing value
        else
            set image to current application's NSImage's alloc()'s initByReferencingFile:iconPath
        end if
        set success to current application's NSWorkspace's sharedWorkspace's setIcon:image forFile:appPath options:0
        return success
    on error errStr number errorNumber
        display dialog errStr
        return false
    end try
end setAppIcon

-- Analizar una línea del archivo de configuración
on parseLine(aLine)
    set AppleScript's text item delimiters to ","
    set parsedList to text items of aLine
    set AppleScript's text item delimiters to ""
    return parsedList
end parseLine

-- Leer los pares de appIcon de un archivo de texto externo
set appIconPairs to {}

try
    set fileContents to read (configFile as alias)
    set fileLines to paragraphs of fileContents

    repeat with aLine in fileLines
        if aLine is not "" then
            set {appPath, iconPath} to my parseLine(aLine)
            copy {appPath, iconPath} to end of appIconPairs
        end if
    end repeat

on error errStr number errorNumber
    display dialog errStr
    return
end try

set successCount to 0

repeat with appIconPair in appIconPairs
    set {appPath, iconPath} to appIconPair
    if setAppIcon(appPath, iconPath) then
        set successCount to successCount + 1
    end if
end repeat

if successCount > 0 then
    -- Reiniciar el Dock para actualizar los iconos
    do shell script "killall Dock"
    display dialog "Se reemplazaron exitosamente " & (successCount as string) & " iconos."
else
    display dialog "No se realizó ningún cambio."
end if

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X