Ios 背景中的位置不起作用

Ios 背景中的位置不起作用,ios,swift,core-data,locationmanager,Ios,Swift,Core Data,Locationmanager,我正在开发一个代码,该代码应该每10分钟获取一次我的位置,并保存在CoreData中。当我用conectavo应用程序进入后台时,xcode无法看到该服务正在运行的日志,但当我走到街上时,他根本没有保存或保存的次数太少 这是我的代码中应该执行此功能的部分。请参阅在codeData中保存: var saveLocationInterval = 60.0 func applicationDidEnterBackground(application: UIApplication) {

我正在开发一个代码,该代码应该每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 {
        }
    }
我无法解决代码中的另一个主要错误是用户的速度。在方法low I中,我试图将您的速度保存在一个变量中,然后保存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
put

if #available(iOS 9.0, *) {
     locationManager.allowsBackgroundLocationUpdates = true
} else {
    // You don't need anything else on earlier versions.
}

这很可能就是你解决问题所需要的一切。

你设置了UIBackgroundModes吗?我发布了一张屏幕快照,我想我解决了你的问题;请在我的答案下面发表评论,告诉我它是否有效!Ohmigod,我才意识到几个月前我就回答了这个问题…我很抱歉没有早点记住!!无论如何,这肯定会解决您的问题:我会将其添加到我的答案中。因此,我的最终答案(肯定会为您提供答案)已添加到我下面的答案中(在
可能的解决方案2
中)。请让我知道它工作得有多好!!(再次抱歉,我没能早点记住这个把戏。)谢谢,我这么做了,现在我要做一些测试。如果行得通,我就住在这里。不过还是谢谢你。@breno好极了。让我知道它是否有效,如果它解决了您的问题,请务必选中复选标记。交给我吧。Thank you=DI进行了测试,发现即使这样,错误仍在继续。有一次,ipad只是简单地记录数据库中的信息。好吧,那么你的代码可能是错的。尝试执行的位置部分,然后在项目中使用该代码。这应该能奏效。