locationManager didUpdateLocations аварийно завершает работу в режиме ожидания - PullRequest
0 голосов
/ 08 мая 2019

Когда мой экран был заблокирован более чем на 10 секунд или около того, и мое местоположение изменилось, didUpdateLocations срабатывает, но код перестает выполняться примерно на полпути.В частности, он останавливается на строке: print ("locationManager: TriggerStatus").Он выполняет оператор печати, но не идет дальше.Я попытался заменить вызов функции eco? .ToggleStatus () другим кодом, и он все еще останавливается после оператора print.Независимо от того, что код под оператором печати.locationManager.allowsBackgroundLocationUpdates имеет значение true.

Я использую настоящий iPhone для проверки этого кода.Я заметил, что код проходит весь путь (включая вызов и выполнение toggleStatus ()) на симуляторе, когда симулятор находится в режиме блокировки.Я предполагаю, что это потому, что симулятор переводит приложение только в фоновый режим, а не приостанавливает его, но я не уверен.

Еще одна вещь, которую стоит отметить: я тестировал этот код на своем iPhone несколько недель назади он, кажется, работал нормально, в том числе, когда телефон был заблокированЧерез несколько недель я заметил, что он остановился на заявлении о печати.

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    let location = locations[locations.count - 1]

    if location.horizontalAccuracy > 0 {

        var latitude = round(location.coordinate.latitude*1000000)/1000000
        let longitude = round(location.coordinate.longitude*1000000)/1000000
        print("locationManager: latitude is: \(latitude)")
        print("locationManager: longitude is: \(longitude)")


        if settingNewHomeLocation == true {
            keychain.set(String(format:"%f", latitude), forKey: "bLatitude", withAccess: .accessibleAlways)
            keychain.set(String(format:"%f", longitude), forKey: "bLongitude", withAccess: .accessibleAlways)
            print("base latitude is: \(keychain.get("bLatitude")!)")
            print("base longitude is: \(keychain.get("bLongitude")!)")
            settingNewHomeLocation = false
        }

        if keychain.get("bLatitude") != nil { 

            let bLatitude = Double(keychain.get("bLatitude")!)
            let bLongitude = Double(keychain.get("bLongitude")!)

            let baseLocation = CLLocation(latitude: bLatitude!, longitude: bLongitude!)
            let distance = CLLocation(latitude: latitude, longitude: longitude).distance(from: baseLocation)
            print("locationManager: distance is: \(distance)")

            if distance > 100 {

                print("locationManager: triggering toggleStatus")
                eco?.toggleStatus()
            }

        } else {
            print("No home location set")
        }
    }
}

РЕШЕНИЕ: Приведенное ниже решение Ананда (без ссылки на брелок) представляется правильным.Я проверил оператор print в начале toggleStatus (), и он включал ссылку на элемент цепочки для ключей, который вызывал сбой.Разница между этой ссылкой цепочки для ключей и ссылками в функции didUpdate заключалась в том, что она была сохранена в цепочке для ключей, созданной с помощью SwiftKeychainWrapper.Я столкнулся с некоторыми другими проблемами с SwiftKeychainWrapper ранее при разработке приложения и переключился на KeychainSwift, когда писал остальную часть кода.По причинам чистой лени (это приложение только для меня), я никогда не возвращался и не переключал значение в toggleStatus ().Удаление ссылки позволило toggleStatus () продолжить.Я все еще изменяю все, но это, кажется, решило проблему.

1 Ответ

1 голос
/ 08 мая 2019

Кажется, вы храните информацию о местоположении в связке ключей.Доступ к цепочке для ключей, когда приложение находится в приостановленном состоянии, не всегда будет свободен от ошибок.Это поведение совершенно странно для фоновых случаев.Когда Touch ID / Face ID включен в устройстве, ситуация усложняется, когда устройство заблокировано.

Допустим, на вашем устройстве включена функция Touch ID / Face ID и устройство заблокировано.Теперь, когда приложение получает обновление местоположения, оно будет пытаться получить доступ к цепочке для ключей, но устройство заблокировано с включенным Touch ID / Face ID.Такое сочетание иногда будет работать, а иногда нет.Тем не менее, я ищу, почему это происходит.

...