Из документации Apple Видео «Встреча с MapKit для SwiftUI» Я попытался следовать видеоуроку и использовать функцию UserAnnotation(), чтобы получить местоположение пользователя в симуляторе, как в видео. Но это не работает.
BeantownButtons.swift
импортировать SwiftUI импортировать MapKit @доступно(iOS 17.0, *) структура BeantownButtons: Просмотр { @Binding var searchResults: [MKMapItem] @Binding переменная позиция: MapCameraPosition вар видимыйрегион: MKCoordinateRegion? поиск функции (по запросу: строка) { пусть запрос = MKLocalSearch.Request() request.naturalLanguageQuery = запрос request.resultTypes = .pointOfInterest request.region = видимая область ?? MKCoordinateRegion( центр: .парковка, диапазон: MKCoordinateSpan (latitudeDelta: 0,0125, longitudeDelta: 0,0125)) Задача { пусть поиск = MKLocalSearch (запрос: запрос) пусть ответ = попробовать? дождитесь поиска.start() searchResults = ответ?.mapItems ?? [] print("Результаты поиска: \(searchResults)") } } var body: some View { HStack { Кнопка { поиск(по запросу: "детская площадка") } этикетка: { Label("Игровые площадки", systemImage: "figure.and.child.holdinghands") } .buttonStyle(.borderedProminent) Кнопка { поиск(по: "пляж") } этикетка: { Label("Пляжи", systemImage: "beach.umbrella") } .buttonStyle(.borderedProminent) Кнопка { позиция = .регион(.бостон) } этикетка: { Label("Бостон", systemImage: "building.2") } .buttonStyle(.bordered) Кнопка { позиция = .region(.northShore) } этикетка: { Label("Северный берег", systemImage: "water.waves") } .buttonStyle(.bordered) } .labelStyle(.iconOnly) } } #Предварительный просмотр { если #available(iOS 17.0, *) { BeantownButtons(searchResults: .constant([]), позиция: .constant(.automatic)) } еще { ПустойПросмотр() } }
ItemInfoView.swift
импортировать SwiftUI импортировать _MapKit_SwiftUI @доступно(iOS 17.0, *) структура ItemInfoView: Просмотр { // ItemInfoView.swift — получение сцены осмотра @State var LookAroundScene: MKLookAroundScene? @State var маршрут: MKRoute? @State var selectedResult: MKMapItem func getLookAroundScene () { LookAroundScene = ноль Задача { пусть запрос = MKLookAroundSceneRequest (mapItem: selectedResult) LookAroundScene = попробовать? ожидайте запроса.сцена } } // ItemInfoView.swift — формат времени в пути для отображения var travelTime: String? { охранник пусть маршрут еще {возврат ноль} пусть форматтер = DateComponentsFormatter() formatter.unitsStyle = .сокращенно formatter.allowedUnits = [.час, .минута] вернуть formatter.string(от:route.expectedTravelTime) } var body: some View { LookAroundPreview (initialScene: LookAroundScene) .overlay(выравнивание: .bottomTrailing) { HStack { Текст ("\(selectedResult.name ??" "")") если пусть travelTime { Текст (время путешествия) } } .font(.caption) .foregroundStyle(.white) .padding (10) } .onAppear { getLookAroundScene() } .onChange(из: selectedResult) { getLookAroundScene() } } } #Предварительный просмотр { если #available(iOS 17.0, *) { ItemInfoView (выбранный результат: MKMapItem (метка: MKPlacemark (координата: .daraz))) } еще { ПустойПросмотр() } }
CustomMapViewLookAround.swift
импортировать SwiftUI импортировать _MapKit_SwiftUI @доступно(iOS 17.0, *) структура CustomMapViewLookAround: Просмотр { @State частной позиции переменной: MapCameraPosition = .automatic @State Private varvisibleRegion: MKCoordinateRegion? @State var маршрут: MKRoute? @State var searchResults: [MKMapItem] = [] @State Private var selectedResult: MKMapItem? функция getDirections() { print("количество результатов: \(searchResults.count)") маршрут = ноль Guard let selectedResult else { return } пусть запрос = MKDirections.Request() request.source = MKMapItem(метка: MKPlacemark(координата: .parking)) request.destination = выбранныйРезультат Задача { пусть направления = MKDirections (запрос: запрос) пусть ответ = попробовать? ожидайте направления.calculate() маршрут = ответ?.routes.first } } var body: some View { Карта(позиция: $позиция, выбор: $selectedResult) { Annotation("Парковка", координата: .parking) { ZStack { RoundedRectangle (cornerRadius: 5) .fill(.фон) RoundedRectangle (cornerRadius: 5) .stroke(.вторичный, ширина линии: 5) Изображение (имя системы: «автомобиль») .padding(5) } } .annotationTitles(.скрытый) ForEach(searchResults, id: \.self) {результат Маркер(пункт: результат) // .тег(1) } .annotationTitles(.скрытый) если пусть маршрут { MapPolyline(маршрут) .stroke(.blue, ширина линии: 5) } ПользовательскаяАннотация() } .mapStyle(.стандарт) .safeAreaInset(edge: .bottom) { HStack { Разделитель() VStack (интервал: 0) { если пусть selectedResult { ItemInfoView (маршрут: маршрут, выбранный результат: выбранный результат) .frame(высота: 128) .clipShape(RoundedRectangle (cornerRadius: 10)) .padding([.top, .horizontal]) } BeantownButtons (searchResults: $searchResults, позиция: $position,visibleRegion:visibleRegion) .padding(.top) } Разделитель() } .background(.thinMaterial) } .onChange(из: searchResults) { позиция = .автоматический } .onMapCameraChange { контекст в видимаяРегион = контекст.регион } .onChange(из: selectedResult) { получить направление() } .mapControls { КнопкаКартыПользователяМестоположения() КартаКомпас() MapScaleView() } .onAppear { пусть locationManager = CLLocationManager() locationManager.requestAlwaysAuthorization() locationManager.requestWhenInUseAuthorization() } } } #Предварительный просмотр { если #available(iOS 17.0, *) { CustomMapViewLookAround() } еще { ПустойПросмотр() } }
Ошибка:
CLLocationManager() для произошел сбой с ошибкой: Error Domain=kCLErrorDomain Code=1 "(null)" Каждый раз, когда я нажимаю кнопку местоположения,

. Он буферизуется навсегда. Я также добавил конфиденциальность доступа к местоположению в info.plist. Кроме того, установите местоположение симулятора следующим образом:

Конфиденциальность: местоположение всегда использование Описание Конфиденциальность – местоположение всегда и при использовании. Описание использования.
