LocationManagerDidChangeAuthorization не вызываетсяIOS

Программируем под IOS
Ответить
Anonymous
 LocationManagerDidChangeAuthorization не вызывается

Сообщение Anonymous »

Я реализовал класс, соответствующий 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»