swift - 在后台连续运行应用程序

标签 swift background location updates cllocationmanager

我一直在阅读有关位置更新如何工作的苹果开发人员资源,并阅读了有关它的大量堆栈溢出问题。当用户将应用程序置于后台时,我一直试图获取用户在我的应用程序上的位置。下面的代码不是我的代码,我从另一个 stacker 溢出源问题中找到它,这是唯一让我接近我需要的东西。下面的代码可以工作,只更新我的用户位置 25 分钟,然后就停止,但我想要的是,只要应用程序在后台,它就一直工作:(。问题已得到解答,但我'我不太明白整个后台的工作原理。我听说苹果会在 3 分钟左右后自动终止你的应用程序,所以无论如何绕过它会有所帮助。而且我也确实检查了我的后台模式,如位置更新和后台获取中所示甚至还需要 info.plist,据说它应该在终止后自动唤醒我的应用程序,但这似乎也不起作用。如果有人可以帮助我,这将对我的新应用程序有巨大帮助,这是我需要的最后一段代码啊哈,提前谢谢大家。我也想在不添加无声音频文件的情况下做到这一点,这样我的应用程序就不会被拒绝:)

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)
        })
    }
}

最佳答案

您(目前)无法在后台连续运行应用程序。这就是苹果公司的意图,你必须接受这一点。一旦您的应用程序进入后台,核心操作系统就可以随时终止它。

关于swift - 在后台连续运行应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43024564/

相关文章:

css - 背景图像不会显示使用 HTML5 样板

android - Flutter Location Package帮助:我想将用户证明的坐标提取为单独的var/string或double

java - 将 Android 应用程序中的 GPS 功能外包给一个单独的类

android - 以编程方式获取电话地区名称

ios - 使用 SKShapeNode 绘制和删除线条

ios - Swift:Facebook SDK,成功登录后检查缺少的权限

ios - 如何通过放置实际颜色来分配颜色

html - 悬停时背景图像和颜色随持续时间变化

php - REST API 安全设计

iOS : background image black instead of requested image?