SwiftUI: всплывающее окно с разрешением определения местоположения не появляетсяIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI: всплывающее окно с разрешением определения местоположения не появляется

Сообщение Anonymous »

Я работаю над приложением SwiftUI, которому требуются службы определения местоположения, и я реализовал класс LocationManager для обработки обновлений местоположения и разрешений. Однако я столкнулся с проблемой, из-за которой всплывающее окно с разрешением на определение местоположения не появляется при запуске приложения.
Вот моя текущая реализация:
LocationManager.swift:

Код: Выделить всё

import CoreLocation
import SwiftUI

class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
private let locationManager = CLLocationManager()

@Published var userLocation: CLLocation?
@Published var isAuthorized = false
@Published var authorizationStatus: CLAuthorizationStatus = .notDetermined

override init() {
super.init()
locationManager.delegate = self
checkAuthorizationStatus()
}

func startLocationUpdates() {
locationManager.startUpdatingLocation()
}

func stopLocationUpdates() {
locationManager.stopUpdatingLocation()
}

func requestLocationAuthorization() {
print("Requesting location authorization")
DispatchQueue.main.async {
self.locationManager.requestWhenInUseAuthorization()
}
}

private func checkAuthorizationStatus() {
print("Checking authorization status")
authorizationStatus = locationManager.authorizationStatus
print("Initial authorization status: \(authorizationStatus.rawValue)")
handleAuthorizationStatus(authorizationStatus)
}

func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print("Authorization status changed")
authorizationStatus = manager.authorizationStatus
print("New authorization status: \(authorizationStatus.rawValue)")
handleAuthorizationStatus(authorizationStatus)
}

private func handleAuthorizationStatus(_ status: CLAuthorizationStatus) {
switch status {
case .authorizedAlways, .authorizedWhenInUse:
DispatchQueue.main.async {
self.isAuthorized = true
self.startLocationUpdates()
}
case .notDetermined:
requestLocationAuthorization()
case .denied, .restricted:
DispatchQueue.main.async {
self.isAuthorized = false
self.stopLocationUpdates()
print("Location access denied or restricted")
}
@unknown default:
DispatchQueue.main.async {
self.isAuthorized = false
self.stopLocationUpdates()
}
}
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
DispatchQueue.main.async {
self.userLocation = locations.last
}
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Location manager error: \(error.localizedDescription)")
}
}
MapzinApp.swift:

Код: Выделить всё

@main
struct MapzinApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
@StateObject private var locationManager = LocationManager()

var body: some Scene {
WindowGroup {
Group {
if locationManager.authorizationStatus == .notDetermined {
Text("Determining location authorization status...")
} else if locationManager.isAuthorized {
CoordinatorView()
.environmentObject(locationManager)
} else {
Text("Location access is required to use this app. Please enable it in Settings.")
}
}
}
}
}
Ввод в журнал:
  • Проверка статуса авторизации
  • Исходный статус авторизации: 0.
  • Запрашивается авторизация местоположения.
  • Статус авторизации изменен.
  • Новый статус авторизации. : 0
  • Запрос авторизации местоположения
Несмотря на вызов requestWhenInUseAuthorization(), когда статус авторизации равен .notDetermined, разрешение всплывающее окно никогда не появляется. Вот конкретные шаги, которые я предпринял:
Проверил Info.plist, чтобы убедиться в наличии необходимых ключей для использования местоположения:
  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription
  • NSLocationAlwaysAndWhenInUseUsageDescription
Проверено, что целевые настройки приложения включают возможности служб определения местоположения.
Протестировано на реальном устройстве, чтобы убедиться, что это не проблема симулятора.
Я не уверен, что мне может не хватать. Мы будем очень признательны за любые советы или предложения по решению этой проблемы.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/786 ... -appearing
Ответить

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

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

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

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

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