2016-03-22 30 views
11

Her dakika bir geri arama işlevi çağıran bir zamanlayıcıya sahip olan aşağıdaki kodu yazdım. Uygulama arka plana gittiğinde, aynı geri çağrı yöntemini çağıran başka bir zamanlayıcıyı başlattım, ancak arka plan zamanlayıcı sadece üç dakika çalışıyor.Sunucuya konumu güncelleştirmek için arka planda sonsuza dek bir Swift 2.0 uygulaması çalıştırın

Apple'ın arka plan görevlerine yalnızca üç dakika izin verdiğini anlıyorum. Uygulamam, uygulamanın arka planda olduğu zamanlarda bile kullanıcının konumunu her dakika izleyen bir izleme uygulamasına benziyor. Bu nedenle, bu işlevi yerine getirmem gerekiyor.

beginBackgroundTaskWithExpirationHandler'un kullanılacağını öğrendim, ancak uygulamamın doğru olup olmadığını bilmiyorum.

Not: Yer güncellemeleri için uygulama kayıtlarına geçmek için Gerekli arka plan modlarım var.

Herhangi bir çalışma kodu veya bağı çok takdir edilmektedir.

override func viewDidLoad() { 
    super.viewDidLoad() 

    timeInMinutes = 1 * 60 

    self.locationManager.requestAlwaysAuthorization() 

    self.locationManager.requestWhenInUseAuthorization() 

    if CLLocationManager.locationServicesEnabled() { 
     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
     locationManager.startUpdatingLocation() 
    } 

    var timer = NSTimer.scheduledTimerWithTimeInterval(timeInMinutes, target: self, selector: "updateLocation", userInfo: nil, repeats: true) 
} 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){ 
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate 

    self.latitude = locValue.latitude 
    self.longitude = locValue.longitude 

    if UIApplication.sharedApplication().applicationState == .Active { 

    } else { 
     backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({() -> Void in 
      self.backgroundTimer.invalidate() 
      self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true) 
     }) 
    } 
} 

func updateLocation() { 
    txtlocationLabel.text = String(n) 
    self.n = self.n+1 

    var timeRemaining = UIApplication.sharedApplication().backgroundTimeRemaining 

    print(timeRemaining) 

    if timeRemaining > 60.0 { 
     self.GeoLogLocation(self.latitude,Longitude: self.longitude) { 
      results in 
      print("View Controller: \(results)") 
      self.CheckResult(String(results)) 
     } 
    } else { 
     if timeRemaining == 0 { 
      UIApplication.sharedApplication().endBackgroundTask(backgroundTaskIdentifier) 
     } 

     backgroundTaskIdentifier2 = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({() -> Void in 
      self.backgroundTimer.invalidate() 
      self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true) 
     }) 
    } 
} 

cevap

16

Periyodik konum güncellemeleri bu anlatılır IOS.There en iyi dizisindeki zor biraz, okuyabilir olan daha here

sizin zamanlayıcı çalışıyorsa iOS bakılmaksızın, birkaç dakika sonra uygulamanızı sonlandırılacaktır

ya da değil. Bu olsa etrafında bir yolu yoktur, ben bir iyonik uygulamayı yazarken o bağlantı IOS içinde periyodik konum güncellemelerini yöneten hızlı bir sınıfa sahip, bu here kodunu kontrol böylece benzer bir şey yapmak zorunda.

Arka planda periyodik konumlar elde etmek ve cihazın pilini boşaltmamak için, konum kayıtlarının doğruluğu ile oynamanız gerekir, konum yöneticisinin kCLLocationAccuracyThreeKilometers için istenenAktifliğini ayarlayarak doğruluğunu azaltın, Eğer kCLLocationAccuracyBest doğruluğu değiştirmeniz gerekir her 60 saniyede, bu, yeni, doğru konum güncellemesini almak için temsilci etkinleştirmek sonra düşük geri doğruluğu döner. Bir güncelleme alındığında zamanlayıcının başlatılması gerekir.

onun kullanıcı tarafından öldürülmüş sonra arka planda uygulamayı uyanmak için bir yol bulunmaktadır, bunun öldürmeden önce uygulama konumda önemli değişiklikleri işler için uygulama temsilci kullanın. Bu, kullanıcının konumu büyük bir sıçrama yaptığında (200ms civarında olabilir) uygulamayı arka planda uyandırır. Uygulamanın uyandığı zaman, önemli değişiklikler için izleme durdurmak ve periyodik güncellemeleri devam zamanki gibi konum hizmetlerini yeniden başlatın.

Bu yardımcı olur umarım.

Güncelleme

Swift 2'de ayrıca gerekir:

self.locationManager.allowsBackgroundLocationUpdates = true 
+0

Yardım için teşekkürler ... Ben dediğin her 60 saniyede olarak ... Ben hala aynı sonucu elde (yani uygulama çalışır ve güncellemeleri yerini yalnızca doğruluk değerini değiştirerek çalıştı ... Swift oldukça yeniyim o arka plana sonra üç dakika) – Carey

+1

Merhaba, üzgünüm ben söylemeyi unutmuşum ve bu kodunuzda eksik inanıyoruz, ayrıca, konum yöneticisi self.locationManager çizgisinde bir şey arkaplan yerleri etkinleştirmeniz gerekir.allowBackgroundLocationUpdates = true –

+0

Çok teşekkürler kardeşim. Çalıştım! – Carey

0

Sen background location tracking için kütüphane kullanabilirsiniz, kullanım örneği: uygulamasıdır zaman

var backgroundLocationManager = BackgroundLocationManager() 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 

    backgroundLocationManager.startBackground() { result in 
      if case let .Success(location) = result { 
       LocationLogger().writeLocationToFile(location: location) 
      } 
    } 

    return true 
} 

çalışıyor öldürüldü ya da askıya alındı.