【问题标题】:App location in background on iOS 8iOS 8 后台应用程序位置
【发布时间】:2015-03-05 17:46:51
【问题描述】:

我想在应用后台获取用户的位置。如果我使用 9 秒或更短的计时器,它工作正常。如果我使用 10 秒或更长时间,我将无法获取用户的位置...

我的AppDelegate.swift

import UIKit
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
    var window: UIWindow?
    var backgroundTaskIdentifier: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
    var myTimer: NSTimer?

    var locationManager = CLLocationManager()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    func isMultitaskingSupported() -> Bool {
        return UIDevice.currentDevice().multitaskingSupported
    }

    func timerMethod(sender: NSTimer) {
        let backgroundTimerRemainig = UIApplication.sharedApplication().backgroundTimeRemaining

        self.locationManager.startUpdatingLocation()

        if backgroundTimerRemainig == DBL_MAX {
            println("test1")
        } else {
            println("test")
            self.locationManager.delegate = self
            self.locationManager.startUpdatingLocation()
        }
    }

    func applicationWillResignActive(application: UIApplication) {

    }

    func applicationDidEnterBackground(application: UIApplication){
        if !isMultitaskingSupported() {
            return
        }

        myTimer = NSTimer.scheduledTimerWithTimeInterval(60.0,
            target: self,
            selector: "timerMethod:",
            userInfo: nil,
            repeats: true)

        backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler {
            () -> Void in
            UIApplication.sharedApplication().endBackgroundTask(self.backgroundTaskIdentifier)
        }
    }

    func endBackgroundTask() {
        let mainQueue = dispatch_get_main_queue()

        dispatch_async(mainQueue) { 
            [weak self] in
            if let timer = self!.myTimer {
                timer.invalidate()
                self!.myTimer = nil
                UIApplication.sharedApplication().endBackgroundTask(self!.backgroundTaskIdentifier)
                self!.backgroundTaskIdentifier = UIBackgroundTaskInvalid
            }
        }
    }

    func applicationWillEnterForeground(application: UIApplication) {
        if backgroundTaskIdentifier != UIBackgroundTaskInvalid {
            endBackgroundTask()
        }
    }

    func applicationDidBecomeActive(application: UIApplication) {

    }

    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }

    func locationManager(manager: CLLocationManager!, didUpdateToLocation locations: [AnyObject]) {
        var latValue = locationManager.location.coordinate.latitude
        var lonValue = locationManager.location.coordinate.longitude
    }
}

为什么我使用 10 秒或更多秒时无法获取用户的位置?

【问题讨论】:

  • 你注册定位后台模式了吗?
  • 是的,背景->位置更新开启
  • 那么只要你触发了self.locationManager.startUpdatingLocation() didUpdateToLocation 应该在用户的设备每次移动时被调用。

标签: ios swift geolocation location


【解决方案1】:

因为在调用 didEnterBackground 大约 10 秒后,应用会暂停

应用程序在后台,但没有执行代码。系统 将应用程序自动移动到此状态并且之前不通知它们 这样做。挂起时,应用程序仍保留在内存中,但不会 执行任何代码。

这是iOS app lifecycle

如果您想在后台获取位置更新,您有两种选择:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-14
    • 2019-04-18
    • 2015-09-05
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多