สิ่งที่แนบมานั้นเป็นวิธีการแก้ปัญหาอย่างรวดเร็วใน
กำหนดApp registers for location updates
ใน info.plist
ทำให้ locationManager ทำงานอยู่ตลอดเวลา
สลับkCLLocationAccuracy
ระหว่างBestForNavigation
(เป็นเวลา 5 วินาทีเพื่อรับตำแหน่ง) และThreeKilometers
สำหรับช่วงเวลารอที่เหลือเพื่อหลีกเลี่ยงการระบายแบตเตอรี่
ตัวอย่างนี้อัปเดตตำแหน่งทุก ๆ 1 นาทีในเบื้องหน้าและทุก ๆ 15 นาทีในพื้นหลัง
ตัวอย่างทำงานได้ดีกับ Xcode 6 Beta 6 ซึ่งทำงานในอุปกรณ์ iOS 7
ใน App Delegate (mapView เป็นตัวเลือกชี้ไปที่ mapView Controller)
func applicationDidBecomeActive(application: UIApplication!) {
if appLaunched! == false { // Reference to mapView used to limit one location update per timer cycle
appLaunched = true
var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
var window = appDelegate.window
var tabBar = window?.rootViewController as UITabBarController
var navCon = tabBar.viewControllers[0] as UINavigationController
mapView = navCon.topViewController as? MapViewController
}
self.startInitialPeriodWithTimeInterval(60.0)
}
func applicationDidEnterBackground(application: UIApplication!) {
self.startInitialPeriodWithTimeInterval(15 * 60.0)
}
func startInitialPeriodWithTimeInterval(timeInterval: NSTimeInterval) {
timer?.invalidate() // reset timer
locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("getFirstLocationUpdate:"), userInfo: timeInterval, repeats: false)
}
func getFirstLocationUpdate(sender: NSTimer) {
let timeInterval = sender.userInfo as Double
timer?.invalidate()
mapView?.canReportLocation = true
timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: Selector("waitForTimer:"), userInfo: timeInterval, repeats: true)
}
func waitForTimer(sender: NSTimer) {
let time = sender.userInfo as Double
locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
finalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("getLocationUpdate"), userInfo: nil, repeats: false)
}
func getLocationUpdate() {
finalTimer?.invalidate()
mapView?.canReportLocation = true
}
ใน mapView (locationManager ชี้ไปที่วัตถุใน AppDelegate)
override func viewDidLoad() {
super.viewDidLoad()
var appDelegate = UIApplication.sharedApplication().delegate! as AppDelegate
locationManager = appDelegate.locationManager!
locationManager.delegate = self
canReportLocation = true
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
if canReportLocation! {
canReportLocation = false
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
} else {
//println("Ignore location update")
}
}