在后台的位置不起作用

bre*_*eno 3 core-data locationmanager ios swift

我正在开发一个代码,它应该每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 {
        }
    }
Run Code Online (Sandbox Code Playgroud)

我无法解决的代码中的另一个主要错误是用户的速度.在方法中,我试图在变量中保存你的速度,然后保存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
    }
Run Code Online (Sandbox Code Playgroud)

这是我的背景模式

owl*_*ipe 6

可能的解决方案1

您需要一个密钥Info.plist来描述您的应用需要背景位置的原因.

转到您的Info.plist,找到Bundle Version密钥,然后单击将+鼠标悬停在该密钥上时显示的密钥.然后添加密钥NSLocationAlwaysUsageDescription,将其设置为字符串,并将值设置为您想要的描述,例如"我们需要您在后台的位置,以便我们与朋友分享您的位置".

现在您的应用应该可行.如果不......

可能的解决方案2(如果你知道你正在做什么,更可能的解决方案)

借助iOS 9,Apple使其成为物理设备上的应用程序需要一系列特殊代码才能在后台运行位置服务.这个变化没有被广泛报道(如果有的话),但我很快就想到了这个变化.您需要做的就是让位置服务再次在物理设备上在后台运行:

在您的主要位置跟踪视图控制器的ViewDidLoad放置...

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

这将(神秘地)可能是您解决问题所需的全部内容.