Senden Standort-updates alle 30 Minuten in Swift
Habe ich hintergrund-Modus für die Standort-Dienste und-Ziel zu senden, Standort (Breitengrad und Längengrad), um die server alle 30 Minuten. Für jetzt bin ich den Druck genauso in der Konsole. Es scheint zu funktionieren für eine Weile, aber ich Frage mich, wie arbeite ich mit NSTimer in diesem Fall. Und von wo soll ich das aufrufen?
import UIKit
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
var window: UIWindow?
var locationManager = CLLocationManager()
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//Override point for customization after application launch.
return true
}
func applicationWillResignActive(application: UIApplication) {
//Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
//Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(application: UIApplication) {
//Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
//If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
self.locationManager.delegate = self
self.locationManager.startUpdatingLocation() //I know i should be using signification location option here. this is just for testing now.
}
func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
self.sendBackgroundLocationToServer(newLocation);
}
func sendBackgroundLocationToServer(location: CLLocation) {
var bgTask = UIBackgroundTaskIdentifier()
bgTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { () -> Void in
UIApplication.sharedApplication().endBackgroundTask(bgTask)
}
println(location.coordinate.latitude)
if (bgTask != UIBackgroundTaskInvalid)
{
UIApplication.sharedApplication().endBackgroundTask(bgTask);
bgTask = UIBackgroundTaskInvalid;
}
}
func applicationWillEnterForeground(application: UIApplication) {
//Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
application.beginBackgroundTaskWithExpirationHandler{}
}
func applicationDidBecomeActive(application: UIApplication) {
//Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
application.beginBackgroundTaskWithExpirationHandler{}
}
func applicationWillTerminate(application: UIApplication) {
//Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
application.beginBackgroundTaskWithExpirationHandler{}
}
}
Vielleicht ruft application.beginBackgroundTaskWithExpirationHandler{}
ist eine schlechte Idee? Welche Möglichkeiten haben ich gehe hier mit?
InformationsquelleAutor der Frage psharma | 2014-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Idee
beginBackgroundTask...
ist zu Beginn eine endliche Länge Aufgabe, so dass, wenn der user verlässt die app läuft weiter im hintergrund Aufgabe für eine kurze, endliche Zeit (3 Minuten, glaube ich). Und bevor die Zeit abläuft, Sie zu rufenendBackgroundTask
oder aber die app wird kurzerhand gekündigt.So, leider, die hintergrund-task-Mechanismus ist nicht wirklich geeignet für Ihre gewünschte Absicht. Es gibt allerdings eine schmale Reihe von besonderen hintergrund-Modi speziell für den häufigen, hintergrund Betrieb außerhalb einer schmalen Reihe von Funktionen (VOIP, audio -, usw.). Weitere Informationen finden Sie in der Umsetzung langzeitaufgaben Abschnitt der App Programming Guide for iOS: Ausführung im Hintergrund.
Nun, einer von denen ein Hintergrundmodus ist für einen "location-service". Also, wenn Sie ein zentrales Merkmal Ihrer app, die unerlässlich für die ordnungsgemäße Funktion ist, dann können Sie sich für die
location
hintergrund-Modus, und Ihre app wird weiterhin im hintergrund ausgeführt. Von dort aus können Sie den monitor für die Lage-updates, und wenn eine ausreichende Menge an Zeit abgelaufen ist, wird der trigger einige Prozess. Aber wenn dieser hintergrund Standort-Modus ist nicht ein wesentliches Merkmal Ihrer app, Apple ist wahrscheinlich ablehnen, Ihre app für die Beantragung einer hintergrund-Modus, die es nicht braucht.Durch die Art und Weise, die Sie sollten sich bewusst sein, dass es ab der standard location services kann der geräteakku. Sie könnten in Erwägung ziehen, die Batterie effizienter "wesentliche änderung" location-service. Dies hat auch die Tugend der automatisch aufwachen Ihre app jedes mal, wenn sich der Benutzer bewegt, einige bedeutende Entfernung (z.B. in km gemessen; ich glaube, es ist ausgelöst durch den Umzug in andere Zelle Turm).
InformationsquelleAutor der Antwort Rob
Paar Anmerkungen, seit wir kämpfen den Ort Probleme und kämpfen mit hintergrund-Anwendungen, die nicht scheinen, um uns zu wecken.
NSTimer ist nur so lange gut, wie Ihre Anwendung wird nicht unterbrochen. Sicher, es ist im hintergrund, aber onlyinasmuchas es ist in der Lage empfangen von Benachrichtigungen aus der iOS-Geräte (APN, Standort, ...). Schließlich, Ihre timer, aufzuhören zu Schießen, während Sie laufen im BG. Also, Sie befinden sich auf einer der BG-Modi zu treten Sie.
Wenn Sie CLLocationManager.startUpdatingLocation, wirst du bemerken, dass du aufhören immer diese nach ein bisschen. Vor allem, wenn Sie das Telefon entspannt und versucht zu schlafen. Dies ist, weil eine schlecht dokumentierte Funktion aufgerufen CLLocationManager.pausesLocationUpdatesAutomatically ... die entscheidet, zu stoppen senden, die, wenn auf "true" gesetzt ist (STANDARDEINSTELLUNG). Sie können diese Einstellung auf "false" gesetzt, und Sie werden weiter um Ihre position updates. Das wird ziemlich viel stellen Sie sicher, dass Ihre app tut, was Sie wollen.
Wie oben erwähnt, müssen Sie sicherstellen, dass Sie, wenn Sie Ihre locationManager.didUpdateLocations Rückruf, dass Sie beginnen, einen backgroundTask um Ihre Anwendung zu arbeiten, während Sie verarbeiten diese Informationen und senden Sie Ihre Netzwerk-Daten. Aber Sie scheinen das zu verstehen.
Wache gerade lange genug, um "record" ein-Standort-update ist nicht so schlecht. Nur stellen Sie sicher, dass Sie nicht laichen Ihre Netzwerk-code, es sei denn, Sie haben eindeutig hit 30 min Erwartung.
InformationsquelleAutor der Antwort GNewc
versuchen Sie dies:
NSNotification
AppDelegate
'swillEnterBackGround
senden Sie eine Benachrichtigung perNSNotificationCenter
dann, Ihr singleton start
updatingLocation
aus und senden Sie es zum server, wenn Standort-Daten empfangen werden.InformationsquelleAutor der Antwort Pham Hoan