Esta es mi primera aplicación para Mac.
Me gustaría enviar correos electrónicos comparando la fecha actual y la fecha guardada de los clientes por el usuario en sqlite solo una vez, todos los días, dependiendo de la condición, de forma asíncrona.
Esta es mi primera aplicación para Mac.
Me gustaría enviar correos electrónicos comparando la fecha actual y la fecha guardada de los clientes por el usuario en sqlite solo una vez, todos los días, dependiendo de la condición, de forma asíncrona.
Nota: Supongo que al decir "asíncrono" quiere decir "haga esto, ya sea que el usuario haya iniciado sesión y esté ejecutando la aplicación a las 9:30 am".
La forma correcta de hacerlo es registrar una llamada con launchd que maneja el trabajo apropiado para su aplicación. Cuando y como haces esto es algo flexible. Si está utilizando un script de instalación de tipo .pkg
, puede registrar el asistente en la instalación. O puede registrarse en la primera ejecución de su aplicación, quizás después de que el usuario haya proporcionado información de configuración suficiente para que la aplicación de ayuda haga su trabajo.
La guía de Daemons and Services incluye Cómo hacer esto con gran detalle. Recomiendo leer eso. Y para obtener una descripción de las propiedades plist que launchd mira, vea esto página de manual .
Como ejemplo de muy alto nivel, supongamos que su aplicación de ayuda se puede encontrar en su paquete en MyPackage.app/Contents/SharedSupport/bin/myhelper
. Aquí hay un archivo plist
que lo lanzaría todos los días a las 9:30 am y las 9:30 pm en la máquina:
<?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>
<!-- This label needs to be unique to the system -->
<key>Label</key>
<string>com.mycompany.mypackage.myhelper</string>
<!-- Toggle to true to prevent it from running -->
<key>Disabled</key>
<false/>
<!-- This is the full path to the helper application -->
<key>Program</key>
<string>/Applications/MyPackage.app/Contents/SharedSupport/bin/myhelper</string>
<!-- This is an array of string arguments to pass in to the app when it's called -->
<key>ProgramArguments</key>
<array>
<string>--daemon</string>
</array>
<!-- This works much like cron to state when the job should be run -->
<key>StartCalendarInterval</key>
<array>
<!-- Run at 9:30 am -->
<dict>
<key>Minute</key>
<integer>30></integer>
<key>Hour</key>
<integer>9</integer>
</dict>
<!-- Run at 9:30 pm -->
<dict>
<key>Minute</key>
<integer>30></integer>
<key>Hour</key>
<integer>21</integer>
</dict>
<array>
</dict>
</plist>
Guarde eso en /Library/LaunchAgents/com.mycompany.mypackage.myhelper.plist
en su máquina y luego escriba:
sudo launchctl load /Library/LaunchAgents/com.mycompany.mypackage.myhelper.plist
Para registrarlo de inmediato con launchd
. En el reinicio debe registrarse automáticamente. Consulte la sección launchctl página de manual para obtener más información sobre cómo usarla para interactuar con launchd.
(Suponiendo que estés usando Objective-C / Cocoa)
La ruta que tomaría:
Calcule la cantidad de tiempo para el evento
Use performSelector:withObject:afterDelay:
(disponible en NSObject
)
Incluya cualquier lógica adicional adicional (como llamadas a otros métodos o su lógica de correo electrónico) en el método indicado en el método anterior.
Lea otras preguntas en las etiquetas mac applications