2013-06-19 11 views
5

Sto provando ad inviare notifiche ogni giorno dalla mia app utilizzando il plug-in LocalNotification che ho trovato su github. Ho il seguente codice che invia una notifica non appena viene avviata l'applicazione.Notifica locale ripetuta ogni giorno in PhoneGap Android

var notification = cordova.require("cordova/plugin/localNotification"); 

       document.addEventListener('deviceready', onDeviceReady, false); 

       function onDeviceReady() { 
       alert('device ready'); 
       var id = 0; 
     id++; 
     newDate = new Date(); 
     newDate.setUTCHours(1,30,1); 
      notification.add({ 
       id : id, 
       date : newDate, 
       message : "Your message here", 
       subtitle: "Your subtitle here", 
       ticker : "Ticker text here", 
       repeatDaily : true 
      });     
} 

Ma voglio che l'applicazione invii automaticamente una notifica senza essere aperta. L'impostazione dell'opzione repeatDaily su true aiuterà?

Ho fatto la mia ricerca e ho scoperto che altri erano in grado di raggiungerlo utilizzando il plug-in LocalNotification.

Non sono abbastanza sicuro su come eseguire il test poiché richiede di tenere acceso l'AVD per un giorno intero. L'obiettivo è molto semplice. Ho bisogno di inviare una singola notifica ogni giorno a un utente senza aprire l'app. Qualsiasi aiuto sarà molto apprezzato !! Grazie !!

risposta

4

Non ho mai usato il plugin ma un po 'di scavo nel codice mi mostra che sì, purché si imposta repeatDaily a true la tua notifica sarà lì ogni giorno.

Se si dà un'occhiata alla classe AlarmHelper è possibile visualizzare la clausola if per l'impostazione di tale parametro da ripetere ogni giorno.

final AlarmManager am = getAlarmManager(); 

... 

if (repeatDaily) { 
     am.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, AlarmManager.INTERVAL_DAY, sender); 
    } else { 
     am.set(AlarmManager.RTC_WAKEUP, triggerTime, sender); 
    } 

Un dettaglio in più sulla classe spiegato AlarmReceiver è che se si imposta l'ora per un tempo precedente, (ad esempio, ora è 11:00 e si imposta la sveglia per ripetere tutti i giorni alle 08:00) lo farà spara immediatamente, quindi nel giorno successivo all'orario previsto. Quindi quella classe ha una clausola if per impedirlo.

if (currentHour != alarmHour && currentMin != alarmMin) { 
      /* 
      * If you set a repeating alarm at 11:00 in the morning and it 
      * should trigger every morning at 08:00 o'clock, it will 
      * immediately fire. E.g. Android tries to make up for the 
      * 'forgotten' reminder for that day. Therefore we ignore the event 
      * if Android tries to 'catch up'. 
      */ 
      Log.d(LocalNotification.PLUGIN_NAME, "AlarmReceiver, ignoring alarm since it is due"); 
      return; 
     } 

Per impostare la data, si utilizza il date param. Nell'esempio si utilizza new Date() che restituisce per impostazione predefinita l'ora corrente e la notifica verrà visualizzata ogni giorno alla stessa ora. Se si desidera specificare un orario diverso per la sveglia, passare un oggetto data con il tempo desiderato!

EDIT

Un modo semplice per rendere sicuro il vostro codice viene eseguito solo una volta sta usando localStorage.

function onDeviceReady(){ 
    ... 
    //note that this will return true if there is anything stored on "isAlarmSet" 
    var isSet = Boolean(window.localStorage.getItem("isAlarmSet")); 
    if (isSet){ 
     //Alarm is not set, so we set it here 
     window.localStorage.setItem("isAlarmSet",1); 
    } 
} 

E proprio fare in modo di cancellare la variabile se mai disinserire l'allarme:

localStorage.removeItem("isAlarmSet); 
+0

Grazie per la risposta. Ho modificato il mio codice secondo il tuo suggerimento. Ora l'ho codificato in modo tale che la notifica venga ripetuta ogni mattina alle 7 del mattino. L'ho provato nel telefono del mio amico. Funziona per la prima volta ma viene ripetuto nello stesso giorno ogni volta che apro la mia app. Quale potrebbe essere la possibile ragione dietro a questo? – bala

+0

Il possibile motivo accanto potrebbe essere che chiami il codice ogni volta che viene eseguita l'app. Dovresti chiamarlo solo una volta per impostarlo e mai più. – caiocpricci2

+0

Per programmarlo, devo chiamare la funzione dopo l'evento 'ondeviceready'. Questo è quello che ho fatto e sembra a posto. L'allarme è scattato alle 7 di oggi. Forse il problema che ho menzionato prima era solo una cosa a parte. Grazie uomo !! – bala