All skills

Xcode 26 and Apple platform update notes with a focus on Liquid Glass, Foundation Models Framework, and Apple Intelligence. Use when asked to explain, summarize, compare, or implement Xcode 26 era framework changes across SwiftUI, UIKit, AppKit, Foundation, App Intents, StoreKit, MapKit, WidgetKit, visionOS, or Swift language features.

Use this Skill: https://skilld.dev/gh/harryworld/xcode26-agent-skills/xcode-26

This session only. Nothing lands on disk.

referencesMapKit-GeoToolbox-PlaceDescriptors.md

≈2.4k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Using Place Descriptors with MapKit and GeoToolbox

Overview

Place descriptors provide a standardized way to represent physical locations across different mapping services. The GeoToolbox framework allows you to create PlaceDescriptor structures that can be used with MapKit and third-party mapping systems. This guide covers how to work with place descriptors, integrate them with MapKit, and leverage their capabilities for location-based applications.

Key concepts:

  • PlaceDescriptor: A structure containing identifying information about a place
  • PlaceRepresentation: Common ways to represent a place (coordinates, addresses)
  • SupportingPlaceRepresentation: Proprietary identifiers for places from different mapping services
  • MapKit integration: Converting between MapKit objects and place descriptors

Creating Place Descriptors

From an Address String

import GeoToolbox

// Create a place descriptor with an address and common name
let fountain = PlaceDescriptor(
    representations: [.address("121-122 James's St \n Dublin 8 \n D08 ET27 \n Ireland")],
    commonName: "Obelisk Fountain"
)

From Coordinates

import GeoToolbox

// Create a place descriptor with coordinates
let eiffelTower = PlaceDescriptor(
    representations: [.coordinate(CLLocationCoordinate2D(latitude: 48.8584, longitude: 2.2945))],
    commonName: "Eiffel Tower"
)

From an MKMapItem

import MapKit
import GeoToolbox

// Convert an MKMapItem to a PlaceDescriptor
func convertMapItemToDescriptor(mapItem: MKMapItem) -> PlaceDescriptor? {
    guard let descriptor = PlaceDescriptor(item: mapItem) else {
        print("Failed to create place descriptor from map item")
        return nil
    }
    return descriptor
}

With Multiple Representations

// Create a place descriptor with multiple representations
let statue = PlaceDescriptor(
    representations: [
        .coordinate(CLLocationCoordinate2D(latitude: 40.6892, longitude: -74.0445)),
        .address("Liberty Island, New York, NY 10004, United States")
    ],
    commonName: "Statue of Liberty"
)

Working with Place Representations

Understanding PlaceRepresentation

PlaceRepresentation is an enumeration that represents a physical place using common mapping concepts:

// Available PlaceRepresentation cases
// .coordinate(CLLocationCoordinate2D) - A location with latitude and longitude
// .address(String) - A full address string

Accessing Representations

// Access the representations from a place descriptor
func printPlaceRepresentations(descriptor: PlaceDescriptor) {
    for representation in descriptor.representations {
        switch representation {
        case .coordinate(let coordinate):
            print("Coordinate: \(coordinate.latitude), \(coordinate.longitude)")
        case .address(let address):
            print("Address: \(address)")
        }
    }
}

Extracting Coordinate

// Get the coordinate from a place descriptor if available
func getCoordinate(from descriptor: PlaceDescriptor) -> CLLocationCoordinate2D? {
    return descriptor.coordinate
}

Extracting Address

// Get the address from a place descriptor if available
func getAddress(from descriptor: PlaceDescriptor) -> String? {
    return descriptor.address
}

Supporting Place Representations

Understanding SupportingPlaceRepresentation

SupportingPlaceRepresentation contains proprietary identifiers for places from different mapping services:

// Available SupportingPlaceRepresentation cases
// .serviceIdentifiers([String: String]) - Maps service provider IDs to place IDs

Working with Service Identifiers

// Create a place descriptor with service identifiers
let landmark = PlaceDescriptor(
    representations: [.address("1 Infinite Loop, Cupertino, CA 95014")],
    commonName: "Apple Park",
    supportingRepresentations: [
        .serviceIdentifiers(["com.apple.maps": "ABC123XYZ", 
                            "com.google.maps": "ChIJq6qq6jK1j4ARzl-WRHNx9CI"])
    ]
)

Retrieving Service Identifiers

// Get a specific service identifier
func getAppleMapsIdentifier(from descriptor: PlaceDescriptor) -> String? {
    return descriptor.serviceIdentifier(for: "com.apple.maps")
}

Geocoding with MapKit

Forward Geocoding (Address to Coordinates)

// Convert an address string to coordinates
func geocodeAddress(address: String) async throws -> [MKMapItem] {
    guard let request = MKGeocodingRequest(addressString: address) else {
        throw NSError(domain: "GeocodingError", code: 1, userInfo: nil)
    }
    
    return try await request.mapItems
}

Reverse Geocoding (Coordinates to Address)

// Convert coordinates to address information
func reverseGeocode(coordinate: CLLocationCoordinate2D) async throws -> [MKMapItem] {
    let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
    
    guard let request = MKReverseGeocodingRequest(location: location) else {
        throw NSError(domain: "ReverseGeocodingError", code: 1, userInfo: nil)
    }
    
    return try await request.mapItems
}

Creating PlaceDescriptor from Geocoding Results

// Create a place descriptor from geocoding results
func createDescriptorFromGeocodingResult(address: String) async throws -> PlaceDescriptor? {
    let mapItems = try await geocodeAddress(address: address)
    
    guard let firstItem = mapItems.first else {
        return nil
    }
    
    return PlaceDescriptor(item: firstItem)
}

Practical Examples

Creating and Using Place Descriptors

// Example: Creating and using a place descriptor for a landmark
func workWithLandmark() {
    // Create a place descriptor for a landmark
    let landmark = PlaceDescriptor(
        representations: [
            .coordinate(CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194)),
            .address("San Francisco, CA, USA")
        ],
        commonName: "San Francisco"
    )
    
    // Access the common name
    if let name = landmark.commonName {
        print("Landmark name: \(name)")
    }
    
    // Access the coordinate
    if let coordinate = landmark.coordinate {
        print("Latitude: \(coordinate.latitude), Longitude: \(coordinate.longitude)")
    }
    
    // Access the address
    if let address = landmark.address {
        print("Address: \(address)")
    }
}

Converting Between MapKit and GeoToolbox

// Example: Converting between MKMapItem and PlaceDescriptor
func convertBetweenMapKitAndGeoToolbox() async throws {
    // Start with an address
    let address = "1 Apple Park Way, Cupertino, CA 95014"
    
    // Geocode to get MKMapItem
    guard let request = MKGeocodingRequest(addressString: address) else {
        print("Failed to create geocoding request")
        return
    }
    
    let mapItems = try await request.mapItems
    
    guard let mapItem = mapItems.first else {
        print("No results found")
        return
    }
    
    // Convert MKMapItem to PlaceDescriptor
    guard let descriptor = PlaceDescriptor(item: mapItem) else {
        print("Failed to create descriptor from map item")
        return
    }
    
    // Use the descriptor
    print("Created descriptor for: \(descriptor.commonName ?? "Unknown place")")
    
    // Create a new MKMapItem from the descriptor's information
    if let coordinate = descriptor.coordinate {
        let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
        let address = MKAddress()
        let newMapItem = MKMapItem(location: location, address: address)
        
        print("Created new map item at: \(newMapItem.location.coordinate.latitude), \(newMapItem.location.coordinate.longitude)")
    }
}

Working with Multiple Mapping Services

// Example: Working with identifiers from multiple mapping services
func workWithMultipleServices() {
    // Create a place descriptor with identifiers for multiple services
    let place = PlaceDescriptor(
        representations: [.coordinate(CLLocationCoordinate2D(latitude: 51.5074, longitude: -0.1278))],
        commonName: "London Eye",
        supportingRepresentations: [
            .serviceIdentifiers([
                "com.apple.maps": "AppleMapsID123",
                "com.google.maps": "GoogleMapsID456",
                "com.openstreetmap": "OSM789"
            ])
        ]
    )
    
    // Get identifiers for different services
    if let appleID = place.serviceIdentifier(for: "com.apple.maps") {
        print("Apple Maps ID: \(appleID)")
    }
    
    if let googleID = place.serviceIdentifier(for: "com.google.maps") {
        print("Google Maps ID: \(googleID)")
    }
    
    if let osmID = place.serviceIdentifier(for: "com.openstreetmap") {
        print("OpenStreetMap ID: \(osmID)")
    }
}

References

Source: SKILL.md on GitHub

No alerts6mo4 checks · Risk SAFE
  • Gen Agent Trust Hub7mo

    The skill is a documentation resource for Xcode 26 features and Apple frameworks. It contains reference markdown files with code snippets and architectural guidance. No malicious behavior, obfuscation, or security vulnerabilities were detected.

  • Socket6mo

    No alerts

  • Snyk7mo

    Risk: LOW · No issues

  • Runlayer7mo

    2/21 files flagged

Signed by skilld at de9a679. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 months ago.

Dormantupdated 9 months ago

README badge

README badge for harryworld/xcode26-agent-skills