2015-12-30 15 views
5

Próbuję uzyskać aktualizacje lokalizacji nawet we wszystkich stanach, nawet gdy aplikacja jest zabijana/usuwana/zawieszana. Włączyłem pobieranie w tle w kodzie Xcode i zaimplementowałem następujący kod (użyte odniesienie "Capture location in all states app"). Ale kiedy kończę aplikację, daje czerwoną linię na AppDelegate klasy. Nie rozumiem, jaki jest tutaj problem. Zrobiłem to przy użyciu rozwiązania pytania "Getting location for an iOS app when it is in the background and even killed" tutaj, ale nie działa ono w ios 9. Proszę mi pomóc lub powiedzieć mi inne rozwiązanie.Aktualizacja lokalizacji, nawet gdy aplikacja zostanie zabita/zakończona.

zaktualizowanego kodu -

class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate { 

var window: UIWindow? 
var locationManager: CLLocationManager? 
var significatLocationManager : CLLocationManager? 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { 
    if(UIApplication.sharedApplication().backgroundRefreshStatus == UIBackgroundRefreshStatus.Available){ 
     print("yessssss") 
    }else{ 
     print("noooooo") 
    } 

    if let launchOpt = launchOptions{ 
     if (launchOpt[UIApplicationLaunchOptionsLocationKey] != nil) { 
      self.significatLocationManager = CLLocationManager() 
      self.significatLocationManager?.delegate = self 
      self.significatLocationManager?.requestAlwaysAuthorization() 
      if #available(iOS 9.0, *) { 
       self.significatLocationManager!.allowsBackgroundLocationUpdates = true 
      } 
      self.significatLocationManager?.startMonitoringSignificantLocationChanges() 

     }else{ 

      self.locationManager   = CLLocationManager() 
      self.locationManager?.delegate = self 
      self.locationManager?.requestAlwaysAuthorization() 
      if #available(iOS 9.0, *) { 
       self.locationManager!.allowsBackgroundLocationUpdates = true 
      } 

      self.locationManager?.startMonitoringSignificantLocationChanges() 
     } 

    }else{ 

     self.locationManager   = CLLocationManager() 
     self.locationManager?.delegate = self 
     self.locationManager?.requestAlwaysAuthorization() 
     if #available(iOS 9.0, *) { 
      self.locationManager!.allowsBackgroundLocationUpdates = true 
     } 

     self.locationManager?.startMonitoringSignificantLocationChanges() 

    } 

    return true 
} 



func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){ 

    let locationArray = locations as NSArray 
    let locationObj = locationArray.lastObject as! CLLocation 
    let coord = locationObj.coordinate 
     } 


func applicationDidEnterBackground(application: UIApplication) { 

    if self.significatLocationManager != nil { 

     self.significatLocationManager?.startMonitoringSignificantLocationChanges() 
    }else{ 

     self.locationManager?.startMonitoringSignificantLocationChanges() 
    } 


} 
+1

Możliwe duplikaty: http://stackoverflow.com/questions/30396367/getting-location-for-an-ios-app-when-it-is-in-the-background i nawet zabity –

+1

* "daje czerwoną linię na AppDelegate klasy" * - jest to najgorszy i najmniej pomocny opis błędu. Proszę opublikować komunikat o błędzie tutaj. Jeśli uruchomiłeś aplikację za pośrednictwem Xcode, normalne jest, że "czerwona linia" pojawia się, jeśli wymusisz zamknięcie aplikacji. – luk2302

+0

Tak, wymuszam zakończenie aplikacji i pojawia się ten błąd w postaci czerwonej linii, ale nie otrzymuję aktualizacji lokalizacji w sprawie zakończenia aplikacji. Jaki jest problem? – Kirti

Odpowiedz

0

Sprawdź ten poradnik: http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended

a kod źródłowy tutaj: https://github.com/voyage11/GettingLocationWhenSuspended

Nadzieję dostaniesz odpowiedź. To działa dla mnie. Teraz próbuję utworzyć żądanie http, gdy wywoływana jest funkcja "didUpdateLocations", dzięki czemu mogę przechowywać bieżącą lokalizację użytkownika na serwerze, gdy aplikacja nie jest uruchomiona (Zawieszona/zakończona/zabita).

Nie sądzę, aby firma Apple mogła wysyłać żądania http, gdy aplikacja jest zawieszona/zakończona. Ale jeśli serwer otrzymał żądanie aktualizacji lokalizacji, to dobrze mi z tym poradzić. Ponieważ nie potrzebuję odpowiedzi z serwera. Potrzebujesz dużo testów ...