2016-05-13 4 views
1

Ich habe eine standortbasierte iPhone-App für soziale Netzwerke in Swift geschrieben, die das Parse SDK verwendet.Parse: Benutzerstandort bei geöffneter App aus Hintergrund/inaktivem Status aktualisieren (Swift)

Wenn die Anwendung gestartet wird und der Benutzer angemeldet ist, wird PFQueryTableViewController geladen. Dies ist die Startseite, die im Prinzip einen Live-Feed von Posts von Benutzern innerhalb eines Umkreises von x Meilen anzeigt, in denen Benutzer diese Posts mögen oder kommentieren können.

Derzeit, wenn der Benutzer an einen neuen Ort bewegt (außerhalb der festgelegten Meile Radius) dann geht zurück in die App, der gleiche Feed zeigt, auch wenn der Benutzer zieht die Tabellenansicht zu aktualisieren. Der neue Feed von Posts wird nur dann am neuen Standort aktualisiert, wenn der Nutzer die App beendet und die App erneut startet.

Mein Ziel ist es, die aktuelle Standortaktualisierung des Benutzers zu haben, nachdem der Benutzer die App durch Drücken der iPhone-Home-Taste oder Multitasking auf eine andere App beendet (nicht beendet) und die App dann erneut öffnet (nicht neu startet). Mit anderen Worten, der Feed sollte auf den neuen Standort aktualisiert werden, wenn die App wieder aktiv wird. Ich denke, dass ich irgendwie einige der Funktionen in der PFQueryTableViewController von applicationDidBecomeActive aufrufen muss, aber ich bin mir nicht sicher.

Ich schätze jede Hilfe sehr. Ich danke dir sehr.

In meinem PFQueryTableViewController:

override func viewDidLoad() { 
    ... 
    queryForLocation() 
    queryForLikes() 
} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    self.tableView.reloadData() 
    self.loadObjects() 

} 

func queryForLocation() { 

    /* From documentation: 
    When the following code is run, the following happens: 

    1) An internal CLLocationManager starts listening for location updates (via startsUpdatingLocation). 
    2) Once a location is received, the location manager stops listening for location updates (via stopsUpdatingLocation) and a PFGeoPoint is created from the new location. If the location manager errors out, it still stops listening for updates, and returns an NSError instead. 
    3) Your block is called with the PFGeoPoint 

    ***Are we supposed to use `startsUpdatingLocation` somewhere? (So that it updates the location (currLocation) because it is used in queryForTable() to return the query*** 

    */ 

    PFGeoPoint.geoPointForCurrentLocationInBackground { 
     (geoPoint: PFGeoPoint?, error: NSError?) -> Void in 

     if error == nil { 
      // store the new geoPoint in currLocation GeoPoint property 
      self.currLocation = geoPoint 

      // this should call queryForTable 
      self.loadObjects() 

     } else { 
      // Unable to fetch the current device's location. 
     } 

    } 

} 

override func queryForTable() -> PFQuery { 

    let query = PFQuery(className: "Posts") 

    // self.currLocation obtained from `geoPointForCurrentLocationInBackground` call in queryForLocation() but does not seem to be update to new location on app open (not launch). 
    if let userLocation = self.currLocation { 

     query.whereKey("location", nearGeoPoint: userLocation, withinMiles: 5) 

     query.includeKey("User") 

     query.cachePolicy = PFCachePolicy.NetworkOnly 

     // If no objects are loaded in memory, we look to the cache first to fill the table and then subsequently do a query against the network. 
     if (self.objects?.count == 0) { 

      query.cachePolicy = PFCachePolicy.CacheThenNetwork 

     } 

     query.limit = 200; 

     return query 

    } else { 

     /* How the application should react if there is no location available */ 

     return PFQuery() 

    } 


} 

Antwort

0

Sie rufen Ihre queryForLocation() nur in Ihrer viewDidLoad Methode, aber wenn die App Hintergrund geht dann Vordergrund, viewDidLoad nicht abgerufen wird, das ist, warum Sie keine neue Position haben.

Sie können sich einfach für die UIApplicationWillEnterForegroundNotification Benachrichtigung registrieren, damit Sie benachrichtigt werden, wenn die App wieder in den Vordergrund gebracht wird.

einfach (wenn Sie nicht Xcode verwenden 7.3, müssen Sie selector: "willEnterForeground" verwenden), um Ihre viewDidLoad Methode:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourViewController.comeFromBackground), name: UIApplicationWillEnterForegroundNotification, object: nil) 



func comeFromBackground() { 
    // This is where you should do your request for location again 
} 

Also jedes Mal wenn Sie Ihre App geht Hintergrund-> Vordergrund wird diese Funktion aufgerufen werden.

Vergessen Sie nicht, den Beobachter im viewDidDisappear zu entfernen:

NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillEnterForegroundNotification, object: nil) 

Hope this helfen Ihnen dabei!

+0

Danke für die Antwort! Frage: Wird 'comeFromBackground()' immer noch aufgerufen, wenn der Benutzer den Hintergrund von einem anderen View-Controller (neben dem PFQueryTableViewController) eingegeben hat? Wäre es außerdem besser, den PFQueryTableViewController zu benachrichtigen, um den Speicherort von AppDelegate anstelle von PFQueryTableViewController zu aktualisieren? Wenn das so ist, wie? Vielen Dank! – DiligentDev

+0

Wenn Sie möchten, dass ein anderer Controller benachrichtigt wird, wenn die App im Hintergrund läuft, können Sie einfach denselben Beobachter hinzufügen, indem Sie einfach den Selektor ändern, wenn Sie eine andere Funktion aufrufen möchten. Ich verstehe deine zweite Frage nicht wirklich. – Chajmz

+0

Also wird der Code, den Sie zur Verfügung gestellt haben, comeFromBackground() aufrufen oder nicht, wenn sich der Benutzer auf einem anderen Viewcontroller (d. H. Der Kommentarseite eines Beitrags) befand, als sie den Hintergrund betraten? – DiligentDev

Verwandte Themen