Voglio eseguire un codice per aggiornare il viewcontroller quando la mia notifica locale è stata inviata, ho provato la funzione didReceiveLocalNotification
, ma funziona solo quando l'utente fa clic sulla notifica, mi chiedevo se c'era un modo per eseguire una funzione quando la notifica è stata inviata?C'è un modo per eseguire del codice quando viene inviata una notifica locale?
risposta
È possibile eseguire gli aggiornamenti dal metodo che si sta utilizzando per inviare la notifica.
Penso che non sia possibile sapere quando viene inviata la notifica locale principalmente perché è possibile pianificare la notifica locale o inviarla immediatamente in caso di app in background.
Secondo Apple:
si pianifica una notifica locale chiamando
scheduleLocalNotification:
. L'app utilizza la data dell'incendio specificata nell'oggettoUILocalNotification
per il momento della consegna. In alternativa, è possibile presentare immediatamente la notifica chiamando il metodopresentLocalNotificationNow:
.Le app possono anche trovare utili le notifiche locali quando vengono eseguite in background e arrivano alcuni messaggi, dati o altri elementi che potrebbero essere di interesse per l'utente. In questo caso, un'app può presentare la notifica immediatamente utilizzando il metodo
UIApplication
presentLocalNotificationNow:
(iOS fornisce a un'app un tempo limitato per l'esecuzione in background).
Non c'è modo di sapere quando è stato inviato il UILocalNotification
, ma quando è stato ricevuto, ovviamente. Nel tuo caso suppongo che si desidera pianificare un UILocalNotification
quindi cerchiamo di divisa per parti:
La notifica viene consegnato quando l'app non è aperto e il tocco dell'utente è
Il delegato di un L'app iOS implementa il metodo
application:didFinishLaunchingWithOptions:
per gestire una notifica locale. Ottiene l'oggettoUILocalNotification
associato dal dizionario delle opzioni di avvio utilizzando la chiaveUIApplicationLaunchOptionsLocalNotificationKey
. In questo modo puoi sapere dove è stata aperta l'app toccando loUILocalNotification
. Vedere il seguente codice:func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { if let launchNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification { // do anything you want update UIViewController, etc } return true }
La notifica viene consegnato quando l'applicazione è in esecuzione e il tocco dell'utente è
volta che l'utente toccare la
UILocalNotification
si può gestire con il metododidReceiveLocalNotification
e fare tutto ciò vuoi dentro.La notifica viene consegnato quando l'applicazione è in esecuzione e l'utente non toccare lo
Nel caso in cui l'utente non toccare l'UILocalNotification
l'unica cosa che puoi fare per sapere se il tuo UILocalNotification
è stato inviato è mantenere un elenco con il UILocalNotifications
che hai programmato prima e controllare più tardi (questa non è una soluzione eccellente, ma il suo lavoro).
esistono tuttavia sempre la UIApplicationWillEnterForegroundNotification
che può essere utilizzato per notificare al UIViewController
si desidera aggiornare che l'applicazione entrerà in primo piano come in questo modo:
private var foregroundNotification: NSObjectProtocol!
override func viewDidLoad() {
super.viewDidLoad()
foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue()) {
[unowned self] notification in
print("Notified ViewControllerB")
}
}
deinit {
// make sure to remove the observer when this view controller is dismissed/deallocated
NSNotificationCenter.defaultCenter().removeObserver(foregroundNotification)
}
Credo che bisogna pensare correttamente quello che ti serve da fare all'interno della tua app quando la tua notifica viene ricevuta nel caso in cui l'utente non la tocchi.
Spero che questo ti aiuti.
c'è un metodo per questo in Objective C, è possibile cercare il simile per rapida .. Aggiungi l'metodo nella AppDelegate
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions UNNotificationPresentationOptionBadge))completionHandler{
[self.tableview reloadData];
}
Penso che questo sarà aiutare ..
Grazie così molto, penso di essere così vicino all'aggiornamento della vista quando l'utente non tocca la notifica ma entra nell'app dopo che la notifica è stata inviata. Ma sembra che ottengo "Notified ViewControllerB" ogni volta che apro l'app, e non solo dopo una notifica. Penso che sia perché non si deinit-correttamente o nel posto giusto nella mia app. –
@ LudvigSørensen No, se il 'UIViewController' è ancora in memoria, verrai avvisato di ciò, solo quello. –
ohh okay. Sto costruendo questa app per le sfide quotidiane, in cui un utente riceverà una sfida quotidiana e sarà quindi in grado di completarlo. La funzione che voglio eseguire subito dopo l'invio della notifica è una nuova funzione di recupero, in modo che la vista si aggiorni e fornisca all'utente una nuova sfida. Ma l'unico problema è che quando eseguo quella funzione nel codice che mi hai dato, la vista viene aggiornata ogni volta che l'utente rientra nell'app. E voglio solo aggiornare la vista quando arriva una nuova sfida. (ogni giorno) –