我正在开发一个代码,它应该每10分钟获取一次我的位置并在CoreData中获得救赎。当我使用conectavo app进入后台时,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
}
答案 0 :(得分:6)
可能的解决方案1
您需要Info.plist
中的密钥来说明您的应用需要背景位置的原因。
转到Info.plist
,找到Bundle Version
键,然后点击将鼠标悬停在该+
上时显示的NSLocationAlwaysUsageDescription
。然后添加密钥ViewDidLoad
,将其设置为字符串,并将值设置为您想要的描述,例如"我们需要您在后台的位置,以便我们与朋友分享您的位置。 "
现在你的应用应该可行了。如果它没有......
可能的解决方案2(如果您知道自己正在做什么,更有可能解决方案)
借助iOS 9,Apple使其成为物理设备上的应用程序需要一行特殊代码才能在后台运行位置服务。这个变化没有被广泛报道(如果有的话),但我很快就想到了这个变化。您需要做些什么才能让位置服务再次在后台运行在物理设备上:
在您的主要位置跟踪视图控制器的if #available(iOS 9.0, *) {
locationManager.allowsBackgroundLocationUpdates = true
} else {
// You don't need anything else on earlier versions.
}
放置...
%
这将(神秘地)足以解决您的问题。