我在Swift中的位置有问题。
在模拟器上工作正常但设备无法正常工作
我使用模拟器iPhone 6 iOS 8.3和设备iPhone 6 iOS 8.3
我的代码:
import UIKit
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,
CLLocationManagerDelegate {
var window: UIWindow?
var locationManager: CLLocationManager! = nil
var isExecutingInBackground = false
func locationManager(manager: CLLocationManager!,
didUpdateToLocation newLocation: CLLocation!,
fromLocation oldLocation: CLLocation!){
if isExecutingInBackground{
println(newLocation);
locationManager.stopUpdatingLocation()
} else {
/* We are in the foreground. Do any processing that you wish */
}
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.delegate = self
locationManager.startUpdatingLocation()
return true
}
func applicationDidEnterBackground(application: UIApplication) {
isExecutingInBackground = true
var timer = NSTimer.scheduledTimerWithTimeInterval(30, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
/* Reduce the accuracy to ease the strain on
iOS while we are in the background */
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
}
func update() {
println("test");
locationManager.startUpdatingLocation()
}
func applicationWillEnterForeground(application: UIApplication) {
isExecutingInBackground = false
/* Now that our app is in the foreground again, let's increase the location
detection accuracy */
locationManager.desiredAccuracy = kCLLocationAccuracyBest
}
}
我希望每30秒获取一次位置
那么为什么不在设备上工作?
答案 0 :(得分:3)
最重要的是,对于后台更新,您要么使用“重大更改”服务,要么您必须请求后台位置服务(Apple限制用于那些迫切需要位置更新的应用,即用于实际的导航应用)。 / p>
请参阅适用于iOS的应用程序编程指南中的Tracking the User’s Location部分:
跟踪用户位置
有几种方法可以在后台跟踪用户的位置,其中大部分都不需要您的应用在后台连续运行:
- 重大变更位置服务(推荐)
- 仅前台位置服务
- 后台位置服务
对于不需要高精度位置数据的应用,强烈建议使用重要更改位置服务。使用此服务,仅当用户的位置发生显着变化时才会生成位置更新;因此,它非常适合为用户提供非关键的,与位置相关的信息的社交应用或应用。如果在更新发生时暂停应用程序,系统会在后台将其唤醒以处理更新。如果应用程序启动此服务然后终止,则系统会在新位置可用时自动重新启动应用程序。此服务在iOS 4及更高版本中可用,并且仅在包含蜂窝无线电的设备上可用。
仅限前台和后台位置服务都使用标准位置核心位置服务来检索位置数据。唯一的区别是,如果应用程序被暂停,仅限前台的位置服务将停止提供更新,如果应用程序不支持其他后台服务或任务,则可能会发生这种情况。仅限前台的位置服务适用于仅在位于前台时需要位置数据的应用程序。
您可以从Xcode项目的“功能”选项卡的“背景模式”部分启用位置支持。 (您也可以通过在应用程序的
UIBackgroundModes
文件中包含Info.plist
键和位置值来启用此支持。)启用此模式不会阻止系统暂停应用程序,但它会告诉系统每当有新的位置数据要传递时,它应该唤醒应用程序。因此,此密钥可以有效地让应用程序在后台运行,以便在它们发生时处理位置更新。重要提示:建议您谨慎使用标准服务或使用重要的位置更改服务。定位服务需要主动使用iOS设备的板载无线电硬件。连续运行此硬件会消耗大量电量。如果您的应用不需要向用户提供准确且连续的位置信息,则最好尽量减少使用位置服务。
有关如何在应用中使用每种不同位置服务的信息,请参阅位置和地图编程指南。