Я реализовал класс, соответствующий 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
LocationManagerDidChangeAuthorization не вызывается ⇐ IOS
Программируем под IOS
-
Anonymous
1719534644
Anonymous
Я реализовал класс, соответствующий CLLocationManagerDelegate, с шаблоном Singleton. Вызов requestWhenInUseAuthorization (т. е. requestPermission() в коде ниже) предлагает пользователю принять, как и ожидалось. Однако locationManagerDidChangeAuthorization(_ Manager: CLLocationManager) не всегда вызывается, когда пользователь нажимает «Разрешить один раз».
Я не нашел никакого шаблона, когда он вызывается, а когда нет, это кажется очень противоречивым (это никогда не вызывается при первом вызове для каждой новой загрузки приложения. Это происходит как на реальном устройстве, так и в симуляторе.
Когда я реализую function ForceInit() и вызываю ее очень рано в моем приложении, все работает хорошо. Таким образом, я предполагаю, что это вызвано ленивой инициализацией синглтона и каким-то образом функция делегата не вызывается, если синглтон инициализируется «слишком поздно». .
[b]Я делаю что-то не так? Зачем мне инициализировать синглтон раньше, если он все равно инициализируется, когда это необходимо вызовом requestPermission()? [/b]
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
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/77532918/locationmanagerdidchangeauthorization-not-being-called[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия