1 votos

¿Cómo invocar un método a una hora determinada de forma asíncrona cada día en una aplicación Mac?

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 sólo una vez cada día dependiendo de la condición, de forma asíncrona.

3voto

shsteimer Puntos 8749

Nota: Estoy asumiendo que por "asíncrono" te refieres a "hacer esto independientemente de que el usuario esté conectado y ejecutando la aplicación a las 9:30 am".

La forma correcta de hacerlo es registrar una llamada con lanzamientod que se encarga del trabajo apropiado para su aplicación. Cuándo y cómo se hace esto es algo flexible. Si está utilizando un .pkg -type installation script puede registrar el ayudante en la instalación. O puede registrarlo en la primera ejecución de su aplicación, quizás después de que el usuario haya proporcionado suficiente información de configuración para que la aplicación de ayuda haga su trabajo.

La guía de demonios y servicios profundiza en cómo hacerlo con gran detalle. Recomiendo su lectura. Y para una descripción de las propiedades plist que launchd mira ver esto página del manual .

Como ejemplo de muy alto nivel, supongamos que su aplicación de ayuda se encuentra en su paquete bajo MyPackage.app/Contents/SharedSupport/bin/myhelper . Aquí hay un plist que lo lanzaría todos los días a las 9:30 am y a 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>

Guarda 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 . Al reiniciar debería registrarse automáticamente. Ver el launchctl para obtener más información sobre su uso para interactuar con launchd.

0voto

ironfroggy Puntos 3496

(Suponiendo que se utilice Objective-C/Cocoa)

La ruta que yo tomaría:

  1. Calcular el tiempo que falta para el evento

  2. Utilice performSelector:withObject:afterDelay: (disponible en NSObject )

  3. Incluya cualquier lógica 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.

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