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 后台应用程序位置的主要内容,如果未能解决你的问题,请参考以下文章