iOS 8 后台应用程序位置

Posted

技术标签:

【中文标题】iOS 8 后台应用程序位置【英文标题】:App location in background on iOS 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 应该在用户的设备每次移动时被调用。 【参考方案1】:

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

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

这是ios app lifecycle。

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

background task - 但它只能让应用程序最多运行 3 分钟 Run update locations background mode。

【讨论】:

以上是关于iOS 8 后台应用程序位置的主要内容,如果未能解决你的问题,请参考以下文章

由 iBeacon 触发的 iOS 8 后台位置更新

在 iOS 8 中在计时器/定期更新背景中的位置

后台服务科尔多瓦离子应用程序。背景插件在 ios 8.3 上不起作用

iOS 8 中的定位服务:后台模式

iOS 8 中的定位服务进入“非活动”状态

仅有时在 iOS 后台更新位置