2016-08-01 30 views
9

Ich habe eine JSON-Datei mit Zeichenfolgendaten im Dokumentenverzeichnis gefüllt. In der Benutzeroberfläche der Anwendung gibt es eine UIButton. Beim Drücken der Taste wird eine neue Zeichenfolge an die JSON-Datei angehängt.Ausführen von Vorgängen im Hintergrund, während sich eine iOS-Anwendung im Vordergrund befindet

Jetzt suche ich nach einem iOS-Dienst, der mir hilft, diese Zeichenfolgen (aus der JSON-Datei) mit swift an den Server zu senden. Und dieser Dienst sollte völlig unabhängig von meinem Code sein. Der Punkt ist, wenn ich eine UIButton, der erste Schritt ist eine Zeichenfolge in der JSON-Datei gespeichert wird, dann sollte der Dienst diese Zeichenfolge und senden sie an den Server, wenn Internet verfügbar ist.

Wenn eine Zeichenfolge erfolgreich gesendet wurde, sollte sie aus der JSON-Datei entfernt werden. Dieser Dienst sollte alle 30 Sekunden nachverfolgen, ob eine Zeichenfolge in der JSON-Datei gespeichert ist, und sie dann an den Server senden.

Ich googelte und fand background fetch, aber es löst performFetchWithCompletionHandler Funktion automatisch aus und ich kann nicht wissen, wenn iOS es auslöst. Ich möchte diese Art von Service nach jeweils 30 Sekunden selbst auslösen.

+0

Haben Sie eine Lösung für Ihre Anfrage gefunden? Vielen Dank! – jcasadellaoller

+1

Wie/warum wäre es unabhängig von Ihrer App? – Wain

+2

Wenn Sie nach einem Daemon/Service suchen, haben Sie kein Glück, iOS unterstützt keine benutzerdefinierten Apps, die unbegrenzt laufen. – Cristik

Antwort

10

Überprüfen Sie den Background Execution Teil von Apples App Programming Guide für iOS.

UIApplication bietet eine Schnittstelle zum Starten und Beenden von Hintergrundaufgaben mit UIBackgroundTaskIdentifier.

In der obersten Ebene Ihres AppDelegate, eine Klasse-Level-Taskkennung erstellen:

var backgroundTask = UIBackgroundTaskInvalid 

Erstellen Sie jetzt Ihre Aufgabe mit der Operation, die Sie absolvieren wollen, und den Fehler zu Fall implementieren, wo Ihre Aufgabe nicht tat abgeschlossen, bevor es abgelaufen ist:

backgroundTask = application.beginBackgroundTaskWithName("MyBackgroundTask") { 
    // This expirationHandler is called when your task expired 
    // Cleanup the task here, remove objects from memory, etc 

    application.endBackgroundTask(self.backgroundTask) 
    self.backgroundTask = UIBackgroundTaskInvalid 
} 

// Implement the operation of your task as background task 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
    // Begin your upload and clean up JSON 
    // NSURLSession, AlamoFire, etc 

    // On completion, end your task 
    application.endBackgroundTask(self.backgroundTask) 
    self.backgroundTask = UIBackgroundTaskInvalid 
} 
+1

Beachten Sie, dass dies im Vordergrund ausgeführt wird, wenn die App nicht bis zum Abschluss der Arbeit im Hintergrund läuft. – Cristik

+0

Großartiger Punkt @Cristik. Ich denke, dies ist die Schlusslösung für das, was das OP aufgrund von Apple-Einschränkungen verlangt. – JAL

+0

Danke Freund Ich habe mein Problem bereits mit dem gleichen Ansatz gelöst, den Sie mir gegeben haben. – user3314286

0

Bitte beachten Sie NSURLSessionUploadTask könnte es Ihnen helfen.

2

Was ich getan habe, ist, dass ich nur den von JAL oben besprochenen Ansatz verwende.

das waren die drei Methoden, die ich verwenden

func reinstateBackgroundTask() { 
     if updateTimer != nil && (backgroundTask == UIBackgroundTaskInvalid) { 
      registerBackgroundTask() 
      } 
    } 
    func registerBackgroundTask() { 
     backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { 
      [unowned self] in 
      self.endBackgroundTask() 
     } 
     assert(backgroundTask != UIBackgroundTaskInvalid) 
    } 

    func endBackgroundTask() { 
     NSLog("Background task ended.") 
     UIApplication.sharedApplication().endBackgroundTask(backgroundTask) 
     backgroundTask = UIBackgroundTaskInvalid 
    } 

wo updateTimer vom Typ NSTIMER Klasse Die oben genannten Funktionen sind in meiner eigenen erstellten Klasse mit dem Namen „syncService“ Diese Klasse hat eine initialiser der

ist
init(){ 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.reinstateBackgroundTask), name: UIApplicationDidBecomeActiveNotification, object: nil) 

     updateTimer = NSTimer.scheduledTimerWithTimeInterval(30.0, target: self, selector: #selector(self.syncAudit), userInfo: nil, repeats: true) 
     registerBackgroundTask() 

} 

Dann habe ich gerade diese Klasse aufgerufen und das ganze Problem ist gelöst.

0
DispatchQueue.global(qos: .background).async { // sends registration to background queue 

}