我正在开发一个代码,该代码应每10分钟获取一次我的位置,并在CoreData中进行救助。当我使用conectavo应用程序进入后台并使用xcode时,看不到该服务正在运行的日志,但是当我出去逛街时,他根本没有保存或保存了很少的时间。
这是我应该执行此功能的代码的一部分。请参阅保存在codeData中:
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
,将其设置为字符串,并将值设置为您想要的描述内容,例如“我们需要您在后台的位置,以便我们与朋友共享您的位置”。
现在,您的应用程序应该可以运行了。如果没有...
可能的解决方案2(如果您知道自己在做什么,则更有可能使用的解决方案)
苹果使用iOS 9做到了这一点,以便物理设备上的应用程序需要特殊的代码行才能在后台运行位置服务。对此更改的报道尚未广泛报道(如果有的话?),但不久前我设法弄清了这一变化。您需要执行以下操作才能使位置服务在后台再次在物理设备上运行:
在您的主要位置跟踪视图中,控制器ViewDidLoad
将...
if #available(iOS 9.0, *) {
locationManager.allowsBackgroundLocationUpdates = true
} else {
// You don't need anything else on earlier versions.
}
这将(足以神秘地)解决您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句