Я реализовал класс, соответствующий CLLocationManagerDelegate, с шаблоном Singleton. Вызов requestWhenInUseAuthorization (т. е. requestPermission() в коде ниже) предлагает пользователю принять, как и ожидалось. Однако locationManagerDidChangeAuthorization(_ Manager: CLLocationManager) не всегда вызывается, когда пользователь нажимает «Разрешить один раз».
Я не нашел никакого шаблона, когда он вызывается, а когда нет, это кажется очень противоречивым (это никогда не вызывается при первом вызове для каждой новой загрузки приложения. Это происходит как на реальном устройстве, так и в симуляторе.
Когда я реализую function ForceInit() и вызываю ее очень рано в моем приложении, все работает хорошо. Таким образом, я предполагаю, что это вызвано ленивой инициализацией синглтона и каким-то образом функция делегата не вызывается, если синглтон инициализируется «слишком поздно». .
Я делаю что-то не так? Зачем мне инициализировать синглтон раньше, если он все равно инициализируется, когда это необходимо вызовом requestPermission()?
class LocationService: NSObject, CLLocationManagerDelegate {
static var shared: LocationService = LocationService()
@Published private(set) var authorizationStatus: CLAuthorizationStatus
private let clLocationManager: CLLocationManager
public override init() {
clLocationManager = CLLocationManager()
authorizationStatus = clLocationManager.authorizationStatus
super.init()
clLocationManager.delegate = self
clLocationManager.desiredAccuracy = kCLLocationAccuracyBest
clLocationManager.startUpdatingLocation()
}
func forceInit() { // why do I need this? I would rather not explicitly initialise...
authorizationStatus = clLocationManager.authorizationStatus
}
func requestPermission() {
self.clLocationManager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print("AAA NEW AUTH: \(manager.authorizationStatus)") // not printed unless forceInit() is called right on app launch
self.authorizationStatus = manager.authorizationStatus
// TODO
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let newLocation: CLLocation = locations.first else { return }
// do sth
}
}
Подробнее здесь: https://stackoverflow.com/questions/775 ... ing-called