-
Vá mais longe com o MapKit
Conheça as últimas atualizações do MapKit e do MapKit JS. Vamos apresentar um novo tipo de trajeto — bicicleta — e mostrar como ativar imagens 3D no modo Olhe ao Redor na web. Saiba como a nova API Geocoding permite a conversão entre coordenadas e endereços e como usar a API Address Representations para obter o endereço mais adequado para uma região. Por fim, apresentaremos uma nova maneira de identificar locais que garante que o seu app funcione perfeitamente com o App Intents.
Capítulos
- 0:00 - Introdução
- 0:45 - Encontrar lugares
- 9:34 - Exibir lugares
- 14:14 - Locomover-se
Recursos
Vídeos relacionados
WWDC24
WWDC23
WWDC22
-
Buscar neste vídeo...
-
-
4:49 - Putting Marker on the Map with a coordinate
// Putting Marker on the Map with a coordinate let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) var body: some View { Map { Marker( "Anna Livia Fountain", coordinate: annaLiviaCoordinates ) } } -
5:07 - Creating and resolving a PlaceDescriptor with coordinate PlaceRepresentation
// Creating and resolving a PlaceDescriptor with coordinate PlaceRepresentation import GeoToolbox import MapKit let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) let annaLiviaDescriptor = PlaceDescriptor( representations: [.coordinate(annaLiviaCoordinates)], commonName: "Anna Livia Fountain" ) let request = MKMapItemRequest(placeDescriptor: annaLiviaDescriptor) do { annaLiviaMapItem = try await request.mapItem } catch { print("Error resolving placeDescriptor: \(error)") } -
5:56 - Creating and resolving a PlaceDescriptor with address PlaceRepresentation
// Creating and resolving a PlaceDescriptor with address PlaceRepresentation import GeoToolbox import MapKit let address = "121-122 James's St, Dublin 8" let descriptor = PlaceDescriptor( representations: [.address(address)], commonName: "Obelisk Fountain" ) let request = MKMapItemRequest(placeDescriptor: descriptor) do { obeliskFountain = try await request.mapItem } catch { print("Error resolving placeDescriptor: \(error)") } -
6:45 - Creating a PlaceDescriptor with identifiers
// Creating a PlaceDescriptor with identifiers import GeoToolbox let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) let identifiers = ["com.apple.MapKit" : "ICBB5FD7684CE949"] let annaLiviaDescriptor = PlaceDescriptor( representations: [.coordinate(annaLiviaCoordinates)], commonName: "Anna Livia Fountain", supportingRepresentations: [.serviceIdentifiers(identifiers)] ) -
7:28 - Fetching a MapItem from a PlaceDescriptor
// Fetching a MapItem from a PlaceDescriptor let request = MKMapItemRequest(placeDescriptor: descriptor) let mapitem = try await request.mapItem -
7:43 - Getting a PlaceDescriptor from a MapItem
// Getting a PlaceDescriptor from a MapItem let descriptor = PlaceDescriptor(mapItem: mapitem) -
8:10 - Place Card
// Place Card var body: some View { Map { ForEach(fountains, id:\.name) { fountain in Marker(item: fountain) .mapItemDetailSelectionAccessory(.callout) } } } -
10:45 - Reverse geocode with MapKit
// Reverse geocode with MapKit import MapKit let millCreekCoordinates = CLLocation(latitude: 39.042617, longitude: -94.587526) if let request = MKReverseGeocodingRequest(location: millCreekCoordinates) { do { let mapItems = try await request.mapItems millCreekMapItem = mapItems.first } catch { print("Error reverse geocoding location: \(error)") } } -
13:50 - Forward geocoding with MapKit
// Forward geocoding with MapKit var body: some View { Map { if let mapItem { Marker(item: mapItem) } } .task { let request = MKGeocodingRequest( addressString: "1 Ferry Building, San Francisco" ) do { mapItem = try await request?.mapItems.first } catch { print("Error geocoding location: \(error)") } } } -
14:38 - Allowing Map Selection
// Allowing Map Selection @State var selectedItem: MKMapItem? var body: some View { Map(selection: $selectedItem) { UserAnnotation() ForEach(fountains, id: \.self) { item in Marker(item: item) } } .onChange(of: selectedItem) { // Compute Route } } -
15:00 - Fetch a route
// Fetch a route let request = MKDirections.Request() request.source = MKMapItem.forCurrentLocation() request.destination = selectedItem let directions = MKDirections(request: request) do { let response = try await directions.calculate() returnedRoutes = response.routes } catch { print("Error calculating directions: \(error)") } -
16:06 - Fetch a cycling route
// Fetch a cycling route let request = MKDirections.Request() request.source = MKMapItem.forCurrentLocation() request.destination = selectedItem request.transportType = .cycling let directions = MKDirections(request: request) do { let response = try await directions.calculate() returnedRoutes = response.routes } catch { print("Error calculating directions: \(error)") } -
16:25 - Display a route on the Map
// Display a route on the Map Map { if let mapRoute { UserAnnotation() MapPolyline(mapRoute) .stroke(Color.blue, lineWidth: 5) } } -
16:40 - Cycling directions in MapKit JS
// Cycling directions in MapKit JS let directions = new mapkit.Directions(); directions.route ({ origin: safariPlayground, destination: cherryHillFountain, transportType: mapkit.Directions.Transport.Cycling }, (error, { routes: [{ polyline }] }) => { polyline.style.lineWidth = 5; map.showItems([ new mapkit.PlaceAnnotation(place), new mapkit.PlaceAnnotation( place2, { selected: true } ), polyline ]); }); -
17:26 - Look Around
// Look Around var body: some View { Map { ForEach(fountains, id:\.name) { fountain in Marker(item: fountain) } } .overlay(alignment: .bottomLeading) { if (lookAroundScene != nil) { LookAroundPreview(scene: $lookAroundScene) .frame(width: 230, height: 140) .cornerRadius(10) .padding(8) } } } -
18:10 - Look Around View in MapKit JS
// Look Around View in MapKit JS const placeLookup = new mapkit.PlaceLookup(); const place = await new Promise( resolve => placeLookup.getPlace( "IBE1F65094A7A13B1", (error, result) => resolve(result) ) ); // Create an interactive look around view. const lookAround = new mapkit.LookAround( document.getElementById("container"), place, options ); -
18:35 - Look Around Options
// Look Around Options for MapKit JS const options = { // Enters a full window experience // immediately on load openDialog: true, // Provides a button to enter and // exit full window. showsDialogControl: true, // Provides a button to destroy // the look around view. showsCloseControl: true, }; -
19:10 - Handle MapKit JS Look Around events
// Handle MapKit JS Look Around events lookAround.addEventListener( "close", event => { app.closeView(); event.preventDefault(); } ); lookAround.addEventListener( "load", event => app.fadeInView() ); lookAround.addEventListener( "error", event => app.fadeOutView() ); lookAround.addEventListener( "readystatechange", event => console.log(lookAround.readyState) ); -
20:01 - MapKit JS Look Around Preview
// MapKit JS Look Around Preview const lookAround = new mapkit.LookAroundPreview( document.getElementById("container"), place );
-
-
- 0:00 - Introdução
As pessoas podem navegar e explorar locais globais, incluindo pontos de referência, cafés, lojas e trilhas com o Apple Maps. As plataformas MapKit e MapKit JS permitem integrar esses recursos de mapeamento em seus apps e sites. As atualizações recentes incluem o 'PlaceDescriptor' para localizar e referenciar lugares, geocodificação aprimorada para exibir informações de locais, e as APIs de direções e Look Around para fornecer assistência de navegação.
- 0:45 - Encontrar lugares
O novo framework, GeoToolbox, inclui o tipo 'PlaceDescriptor'. Use 'PlaceDescriptor' para representar lugares usando informações estruturadas, por exemplo, um nome, endereço, coordenada ou localização de um dispositivo. Isso é útil quando você não tem um ID de local do MapKit exclusivo para um local, como ao trabalhar com dados de APIs ou CRMs externos ou ao passar referências de local para código que não usa o MapKit. 'PlaceDescriptor' permite que o MapKit ou outros provedores de serviços de mapeamento encontrem dados avançados sobre o local especificado. A matriz de representações dentro de 'PlaceDescriptor' é ordenada em precedência decrescente, a partir das informações mais precisas, de modo que a identificação da localização seja mais exata. Crie um 'PlaceDescriptor' usando vários métodos, por exemplo, especificando coordenadas, um endereço ou um identificador de serviço. Um identificador de serviço é um dicionário que associa um identificador de pacote a um identificador de local exclusivo para um serviço de mapas específico. Isso permite flexibilidade e interoperabilidade entre diferentes serviços de mapas. Quando você usa um 'PlaceDescriptor' para criar um 'MKMapItemRequest', o MapKit prioriza o uso do identificador do MapKit dos identificadores de serviço, quando disponíveis. Caso contrário, recorre a outras representações, como coordenadas ou endereço, para buscar o local. 'PlaceDescriptors' permitem que você adicione lugares aos mapas, exiba cartões de localização com informações detalhadas e crie links universais para o Apple Maps, proporcionando uma experiência de usuário fluida em diferentes dispositivos e plataformas.
- 9:34 - Exibir lugares
No iOS 18, o processo de geocodificação é integrado ao MapKit, substituindo as classes de CoreLocation descontinuadas 'CLGeocoder' e 'CLPlacemark'. A geocodificação envolve dois processos principais: direto e reverso. A geocodificação direta converte um endereço em coordenadas, enquanto a geocodificação reversa faz o oposto, convertendo coordenadas em um endereço. A nova API do MapKit permite que você faça solicitações de geocodificação reversa usando 'MKReverseGeocodingRequest', que retorna uma matriz de itens de mapa, geralmente contendo apenas uma entrada para o local específico. Use 'MKAddress' e 'MKAddressRepresentations' para exibir informações de endereço. 'MKAddress' fornece strings de endereço curtas e completas, enquanto 'MKAddressRepresentations' oferece mais flexibilidade, permitindo que você personalize a exibição de endereço com base em fatores como a localidade e as necessidades específicas do app, permitindo uma apresentação mais concisa e amigável dos dados de localização.
- 14:14 - Locomover-se
O MapKit fornece uma API de direções que permite que as pessoas encontrem rotas entre locais usando vários meios de transporte, incluindo caminhada, carro e, agora, bicicleta. A API oferece informações detalhadas da rota, como estimativas de tempo e distância, instruções passo a passo e a geometria do percurso para exibição em um mapa. Você pode criar solicitações de direções, definir a origem e o destino e calcular rotas. A resposta inclui locais de origem e destino correspondentes, uma ou mais rotas, além de avisos relevantes, como bloqueio de estradas. O MapKit também se expandiu para incluir suporte a direções de bicicleta no watchOS e MapKit JS, permitindo que as pessoas planejem rotas de bicicleta em seus relógios e sites. Além disso, o recurso Maps Look Around, que fornece imagens em 360 graus ao nível da rua, foi trazido para o app MapKit no iOS 16 e já está disponível no MapKit JS, permitindo que você aprimore seus apps com visualizações de rua interativas.