快速 - 持续运行应用程序在后台

时间:2017-03-26 03:12:04

标签: swift background location updates cllocationmanager

我一直在阅读苹果开发者的资料,了解位置更新的工作方式以及读取吨堆栈溢出问题。当用户将应用程序放在后台时,我试图让我的用户在我的应用程序上的位置。下面的代码不是我的代码,我从另一个堆栈器溢出源问题中找到它,它是唯一使我接近我需要的东西。下面的代码工作,并在用户位置更新我只有25分钟,然后只是停止,但我想要的是它一直工作,只要应用程序在后台:(。问题得到了回答,但我&# 39;我不太了解整个背景材料是如何工作的。我听说苹果会在3分钟左右后自动终止你的应用程序,所以无论如何要绕过它会有所帮助。而且我确实在位置检查了我的背景模式更新和后台获取,甚至是所需的info.plist也被认为是假设自动唤醒我的应用程序一旦终止,但似乎也没有。如果有人可以帮助我这将是一个对我的新应用程序的巨大帮助,这是我需要aha的最后一点代码,提前感谢大家。也希望在不添加静音音频文件的情况下这样做,这样我的应用程序就不会被拒绝:)

override func viewDidLoad() {
    super.viewDidLoad()

    self.locationManager.requestAlwaysAuthorization()

    self.locationManager.requestWhenInUseAuthorization()

    self.locationManager.allowsBackgroundLocationUpdates = true

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()

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

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

    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() {

    var timeRemaining = UIApplication.sharedApplication().backgroundTimeRemaining

    print(timeRemaining)

    if timeRemaining > 60.0 {
            print("timeRemaining > 60.0")
        }
    } else {
        if timeRemaining == 0 {
          print("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)
        })
    }
}

1 个答案:

答案 0 :(得分:2)

你不能(目前)不断在后台运行应用程序。这就是Apple打算如何工作的方式,你必须接受这一点。一旦您的应用程序处于后台,它就可以在核心操作系统的任何时间点终止。