2016-01-26 9 views
5

Sto tentando di inviare all'utente un avviso di tipo "Push Notification" quando l'utente riduce a icona l'app (facendo clic sul pulsante Home dell'iPhone o bloccando anche il telefono).Invia notifiche locali mentre l'app è in esecuzione in background Swift 2.0

La mia app analizza continuamente un file XML (ogni 10 secondi) e voglio che l'app continui a funzionare in modo che invii all'utente una notifica locale una volta che alcune condizioni sono state soddisfatte nel mio programma, anche dopo che l'utente ha ridotto al minimo il app o bloccato il telefono.

Sono rimbalzato dai tutorial e tutti sembrano "pianificare" una notifica, ma questo non funzionerà per me perché la mia notifica non è basata sul tempo, piuttosto si basa sulle condizioni che vengono soddisfatte.

Quello che ho fatto finora:

AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 
    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)) 
    return true 
} 

MapViewController.swift

// Some function 
func someFunction(delta: Int) { 
    if delta < 100 { 
     // Send alert to user if app is open 
     let alertView = UIAlertController(title: "This is an Alert!", message: "", preferredStyle: UIAlertControllerStyle.Alert) 
     alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
     self.presentViewController(alertView, animated: true, completion: nil) 

     // Send user a local notification if they have the app running in the bg 
     pushTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("pushNotification"), userInfo: nil, repeats: false) 
    } 
} 

// Send user a local notification if they have the app running in the bg 
func pushNotification() { 
    let notification = UILocalNotification() 
    notification.alertAction = "Go back to App" 
    notification.alertBody = "This is a Notification!" 
    notification.fireDate = NSDate(timeIntervalSinceNow: 1) 
    UIApplication.sharedApplication().scheduleLocalNotification(notification) 
} 

Alert funziona alla grande, mentre l'applicazione è aperta, ma la notifica non viene mai visualizzata quando minimizzo l'app sul mio telefono. Presumo che l'app non sia in esecuzione mentre è in background o non capisco bene questo concetto. Qualsiasi aiuto è molto apprezzato.

+0

Che cos'è questo delta? Immagino che la tua funzione non venga chiamata in background e quindi la tua notifica dint venga pianificata – Muneeba

+0

@Muneeba delta si trova all'interno di "someFunction" Non ho incluso l'intero codice (cercando di conservare i pezzi rilevanti). Ho modificato il codice in modo che sia un po 'più leggibile. Le cose all'interno dell'istruzione 'if' sono in esecuzione, ho verificato con le istruzioni 'print()'. – Ivan

+0

Scrivi la dichiarazione di stampa nella funzione pushNotification e controlla se viene richiamata in bg. – Muneeba

risposta

9

Per impostazione predefinita NSTimer funziona solo nel simulatore. Prova ad aggiungere questo al tuo file AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Sound, .Alert, .Badge], categories: nil)) 

application.beginBackgroundTaskWithName("showNotification", expirationHandler: nil) 

     return true 
    } 
+0

Sì! Ha funzionato! Grazie! C'è un motivo per cui un suono non viene riprodotto quando viene attivata la notifica? Sto impostando il tipo di notifica su [.Sound, .Alert, .Badge] in modo da riprodurre un suono. A meno che non debba installarlo anche altrove. – Ivan

+1

Non importa. Ho funzionato aggiungendo ** notification.soundName = UILocalNotificationDefaultSoundName ** nella mia funzione pushNotification(). Grazie per l'aiuto! – Ivan

+1

Hai aggiunto questo alla tua notifica? notification.soundName = UILocalNotificationDefaultSoundName – nadi9

Problemi correlati