我正在开发一个代码,它应该每 10 分钟获取我的位置并在 CoreData 中保存。当我使用 conectavo 应用程序进入后台时,xcode 看不到该服务正在运行的日志,但是当我出去走在街上时,他根本没有保存或保存次数太少。
这是我的代码的一部分,应该执行此功能。请参阅保存在代码数据中:
var saveLocationInterval = 60.0
func applicationDidEnterBackground(application: UIApplication) {
UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler(nil)
self.timer = NSTimer.scheduledTimerWithTimeInterval(saveLocationInterval, target: self, selector: #selector(AppDelegate.saveLocation), userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(self.timer, forMode: NSRunLoopCommonModes)
locationController.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
saveLocation()
}
func saveLocation(){
print("======")
let logUser = NSEntityDescription.insertNewObjectForEntityForName("LOG_GPS", inManagedObjectContext: self.managedObjectContext) as! LOG_GPS
if locationController.location == nil{
logUser.latitude = ""
logUser.longitude = ""
} else {
logUser.latitude = "\(locationController.location!.coordinate.latitude)"
logUser.longitude = "\(locationController.location!.coordinate.longitude)"
}
logUser.velocidade = userSpeed > 0 ? Int(userSpeed) : 0
logUser.address = "\(userSpeed)"
if _usuario.chave != nil {
logUser.chave_usuario = "\(_usuario.chave!)"
}
if _empresa.chave != nil {
logUser.chave_licenca = "\(_empresa.chave!)"
}
print("localizaçao salva no bd \(logUser.latitude)")
let date = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd/MM/yy HH:mm:ss"
let dateString = dateFormatter.stringFromDate(date)
logUser.data = dateString
do {
try self.managedObjectContext.save()
} catch {
}
}
我无法解决的代码中的另一个主要错误是用户的速度。在低速方法中,我试图将您的速度保存在一个变量中,然后保存 CoreData 但是我总是返回一个负值:
func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
var speed: CLLocationSpeed = CLLocationSpeed()
speed = newLocation.speed
print(speed * 3.6)
userSpeed = speed * 3.6
}
最佳答案
可能的解决方案1
您的 Info.plist
中需要一个键来描述您的应用为何需要后台定位。
转到您的 Info.plist
,找到 Bundle Version
键,然后单击将鼠标悬停在该键上时出现的 +
。然后添加键 NSLocationAlwaysUsageDescription
,将其设置为字符串,并将值设置为您想要的描述,例如“我们需要您在后台的位置,以便与 friend 分享您的位置。 "
现在您的应用应该可以运行了。如果没有……
可能的解决方案 2(如果您知道自己在做什么,则更有可能的解决方案)
在 iOS 9 中,Apple 让物理设备上的应用程序需要一行特殊的代码才能在后台运行定位服务。这一变化并没有被广泛报道(如果有的话?)但我不久前设法弄清楚了这一点。要使位置服务在物理设备上再次在后台运行,您需要执行以下操作:
在您的主要位置跟踪 View Controller 的 ViewDidLoad
中放置...
if #available(iOS 9.0, *) {
locationManager.allowsBackgroundLocationUpdates = true
} else {
// You don't need anything else on earlier versions.
}
这可能(很神秘)就是您解决问题所需的一切。
关于ios - 背景中的位置不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38719970/