Когда мой экран был заблокирован более чем на 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 () продолжить.Я все еще изменяю все, но это, кажется, решило проблему.