местоположение в фоновом режиме не работает

Я разрабатываю код, который должен получать мое местоположение каждые 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 я пытаюсь сохранить вашу скорость в переменной, а затем сохранить 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
    }

это мой фоновый режим


person breno    schedule 02.08.2016    source источник
comment
вы установили UIBackgroundModes?   -  person Lu_    schedule 02.08.2016
comment
Я публикую снимок экрана   -  person breno    schedule 02.08.2016
comment
Думаю, я решил вашу проблему; комментарий под моим ответом, чтобы сказать мне, работает он или нет!   -  person owlswipe    schedule 02.08.2016
comment
Ohmigod, я только что понял, что ответил на этот же вопрос несколько месяцев назад ... Мне очень жаль, что я не вспомнил об этом раньше !! В любом случае, это определенно решит вашу проблему: stackoverflow.com/questions/36524644/ Я добавлю его в свой ответ.   -  person owlswipe    schedule 17.08.2016
comment
Итак, мой окончательный ответ, который определенно сделает это за вас, был добавлен к моему ответу ниже (в possible solution 2). Пожалуйста, дайте мне знать, насколько хорошо это работает !! (и еще раз извините за то, что не вспомнил этот трюк раньше.)   -  person owlswipe    schedule 17.08.2016


Ответы (1)


Возможное решение 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.
}

Это (достаточно загадочно), вероятно, все, что вам нужно для решения вашей проблемы.

person owlswipe    schedule 02.08.2016
comment
Спасибо, я это сделаю и сейчас сделаю несколько тестов. Если получится, я живу здесь. Но все равно спасибо. - person breno; 02.08.2016
comment
@breno Отлично. Сообщите мне, работает ли он, и не забудьте поставить галочку, если это решит вашу проблему. - person owlswipe; 02.08.2016
comment
Оставь это мне. Спасибо = D - person breno; 02.08.2016
comment
Я провел тесты и обнаружил, что даже после этого ошибка не исчезла. В какой-то момент ipad просто записывал информацию в базу данных. - person breno; 02.08.2016
comment
Хорошо, значит, вы, вероятно, ошиблись в коде. Попробуйте выполнить часть этого руководства по фоновым режимам, затем используя этот код в вашем проекте. Это должно делать свое дело. - person owlswipe; 02.08.2016
comment
@breno Как это обернулось? - person owlswipe; 14.08.2016
comment
Я не решил свою проблему. оставлен в стороне на данный момент, но если вы получите здесь один ответ об обновлении. - person breno; 15.08.2016
comment
@breno Если вы все еще не понимаете, что я обновил свой ответ, я это сделал :). Проверьте это, он решит вашу проблему (и поставьте галочку, если он решит вашу проблему). - person owlswipe; 28.08.2016
comment
Я поместил этот код в свой didFinishLaunchingWithOptions, но не работал. В любом случае, спасибо. - person breno; 29.08.2016
comment
@breno Если какой-либо контроллер представления отслеживания местоположения имеет viewdidload, попробуйте поместить его туда, а не в делегат приложения. - person owlswipe; 29.08.2016