[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E68HDF534KJ8VQRAYYTPE2":3,"skill-same:01M6E68HDF534KJ8VQRAYYTPE2":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6E68HDF534KJ8VQRAYYTPE2","axiom-core-location-ref",null,"Use for Core Location API reference - CLLocationUpdate, CLMonitor, CLServiceSession, authorization, background location, geofencing","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FCharlesWiltgen\u002FAxiom\u002Faxiom-core-location-ref\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32],"core","location","axiom core location ref","macos","ios","authorization","api","use","reference","2026-11-10 10:12:30",false,"---\nname: axiom-core-location-ref\ndescription: Use for Core Location API reference - CLLocationUpdate, CLMonitor, CLServiceSession, authorization, background location, geofencing\nlicense: MIT\ncompatibility: iOS 17+, iPadOS 17+, macOS 14+, watchOS 10+\nmetadata:\n  version: \"1.0.0\"\n  last-updated: \"2026-01-03\"\n---\n\n# Core Location Reference\n\nComprehensive API reference for modern Core Location (iOS 17+).\n\n## When to Use\n\n- Need API signatures for CLLocationUpdate, CLMonitor, CLServiceSession\n- Implementing geofencing or region monitoring\n- Configuring background location updates\n- Understanding authorization patterns\n- Debugging location service issues\n\n## Related Skills\n\n- `axiom-core-location` — Anti-patterns, decision trees, pressure scenarios\n- `axiom-core-location-diag` — Symptom-based troubleshooting\n- `axiom-energy-ref` — Location as battery subsystem (accuracy vs power)\n\n---\n\n## Part 1: Modern API Overview (iOS 17+)\n\nFour key classes replace legacy CLLocationManager patterns:\n\n| Class | Purpose | iOS |\n|-------|---------|-----|\n| `CLLocationUpdate` | AsyncSequence for location updates | 17+ |\n| `CLMonitor` | Condition-based geofencing\u002Fbeacons | 17+ |\n| `CLServiceSession` | Declarative authorization goals | 18+ |\n| `CLBackgroundActivitySession` | Background location support | 17+ |\n\n**Migration path**: Legacy CLLocationManager still works, but new APIs provide:\n- Swift concurrency (async\u002Fawait)\n- Automatic pause\u002Fresume\n- Simplified authorization\n- Better battery efficiency\n\n---\n\n## Part 2: CLLocationUpdate API\n\n### Basic Usage\n\n```swift\nimport CoreLocation\n\nTask {\n    do {\n        for try await update in CLLocationUpdate.liveUpdates() {\n            if let location = update.location {\n                \u002F\u002F Process location\n            }\n            if update.isStationary {\n                break \u002F\u002F Stop when user stops moving\n            }\n        }\n    } catch {\n        \u002F\u002F Handle location errors\n    }\n}\n```\n\n### LiveConfiguration Options\n\n```swift\nCLLocationUpdate.liveUpdates(.default)\nCLLocationUpdate.liveUpdates(.automotiveNavigation)\nCLLocationUpdate.liveUpdates(.otherNavigation)\nCLLocationUpdate.liveUpdates(.fitness)\nCLLocationUpdate.liveUpdates(.airborne)\n```\n\nChoose based on use case. If unsure, use `.default` or omit parameter.\n\n### Key Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `location` | `CLLocation?` | Current location (nil if unavailable) |\n| `isStationary` | `Bool` | True when device stopped moving |\n| `authorizationDenied` | `Bool` | User denied location access |\n| `authorizationDeniedGlobally` | `Bool` | Location services disabled system-wide |\n| `authorizationRequestInProgress` | `Bool` | Awaiting user authorization decision |\n| `accuracyLimited` | `Bool` | Reduced accuracy (updates every 15-20 min) |\n| `locationUnavailable` | `Bool` | Cannot determine location |\n| `insufficientlyInUse` | `Bool` | Can't request auth (not in foreground) |\n\n### Automatic Pause\u002FResume\n\nWhen device becomes stationary:\n1. Final update delivered with `isStationary = true` and valid `location`\n2. Updates pause (saves battery)\n3. When device moves, updates resume with `isStationary = false`\n\nNo action required—happens automatically.\n\n### AsyncSequence Operations\n\n```swift\n\u002F\u002F Get first location with speed > 10 m\u002Fs\nlet fastUpdate = try await CLLocationUpdate.liveUpdates()\n    .first { $0.location?.speed ?? 0 > 10 }\n\n\u002F\u002F WARNING: Avoid filters that may never match (e.g., horizontalAccuracy \u003C 1)\n```\n\n---\n\n## Part 3: CLMonitor API\n\nSwift actor for monitoring geographic conditions and beacons.\n\n### Basic Geofencing\n\n```swift\nlet monitor = await CLMonitor(\"MyMonitor\")\n\n\u002F\u002F Add circular region\nlet condition = CLMonitor.CircularGeographicCondition(\n    center: CLLocationCoordinate2D(latitude: 37.33, longitude: -122.01),\n    radius: 100\n)\nawait monitor.add(condition, identifier: \"ApplePark\")\n\n\u002F\u002F Await events\nfor try await event in monitor.events {\n    switch event.state {\n    case .satisfied:  \u002F\u002F User entered region\n        handleEntry(event.identifier)\n    case .unsatisfied:  \u002F\u002F User exited region\n        handleExit(event.identifier)\n    case .unknown:\n        break\n    @unknown default:\n        break\n    }\n}\n```\n\n### CircularGeographicCondition\n\n```swift\nCLMonitor.CircularGeographicCondition(\n    center: CLLocationCoordinate2D,\n    radius: CLLocationDistance  \u002F\u002F meters, minimum ~100m effective\n)\n```\n\n### BeaconIdentityCondition\n\nThree granularity levels:\n\n```swift\n\u002F\u002F All beacons with UUID (any site)\nCLMonitor.BeaconIdentityCondition(uuid: myUUID)\n\n\u002F\u002F Specific site (UUID + major)\nCLMonitor.BeaconIdentityCondition(uuid: myUUID, major: 100)\n\n\u002F\u002F Specific beacon (UUID + major + minor)\nCLMonitor.BeaconIdentityCondition(uuid: myUUID, major: 100, minor: 5)\n```\n\n### Condition Limit\n\n**Maximum 20 conditions per app.** Prioritize what to monitor. Swap regions dynamically based on user location if needed.\n\n### Adding with Assumed State\n\n```swift\n\u002F\u002F If you know initial state\nawait monitor.add(condition, identifier: \"Work\", assuming: .unsatisfied)\n```\n\nCore Location will correct if assumption wrong.\n\n### Accessing Records\n\n```swift\n\u002F\u002F Get single record\nif let record = await monitor.record(for: \"ApplePark\") {\n    let condition = record.condition\n    let lastEvent = record.lastEvent\n    let state = lastEvent.state\n    let date = lastEvent.date\n}\n\n\u002F\u002F Get all identifiers\nlet allIds = await monitor.identifiers\n```\n\n### Event Properties\n\n| Property | Description |\n|----------|-------------|\n| `identifier` | String identifier of condition |\n| `state` | `.satisfied`, `.unsatisfied`, `.unknown` |\n| `date` | When state changed |\n| `refinement` | For wildcard beacons, actual UUID\u002Fmajor\u002Fminor detected |\n| `conditionLimitExceeded` | Too many conditions (max 20) |\n| `conditionUnsupported` | Condition type not available |\n| `accuracyLimited` | Reduced accuracy prevents monitoring |\n\n### Critical Requirements\n\n1. **One monitor per name** — Only one instance with given name at a time\n2. **Always await events** — Events only become `lastEvent` after handling\n3. **Reinitialize on launch** — Recreate monitor in `didFinishLaunchingWithOptions`\n\n---\n\n## Part 4: CLServiceSession API (iOS 18+)\n\nDeclarative authorization—tell Core Location what you need, not what to do.\n\n### Basic Usage\n\n```swift\n\u002F\u002F Hold session for duration of feature\nlet session = CLServiceSession(authorization: .whenInUse)\n\nfor try await update in CLLocationUpdate.liveUpdates() {\n    \u002F\u002F Process updates\n}\n```\n\n### Authorization Requirements\n\n```swift\nCLServiceSession(authorization: .none)       \u002F\u002F No auth request\nCLServiceSession(authorization: .whenInUse)  \u002F\u002F Request When In Use\nCLServiceSession(authorization: .always)     \u002F\u002F Request Always (must start in foreground)\n```\n\n### Full Accuracy Request\n\n```swift\n\u002F\u002F For features requiring precise location (e.g., navigation)\nCLServiceSession(\n    authorization: .whenInUse,\n    fullAccuracyPurposeKey: \"NavigationPurpose\"  \u002F\u002F Key in Info.plist\n)\n```\n\nRequires `NSLocationTemporaryUsageDescriptionDictionary` in Info.plist.\n\n### Implicit Sessions\n\nIterating `CLLocationUpdate.liveUpdates()` or `CLMonitor.events` creates implicit session with `.whenInUse` goal.\n\nTo disable implicit sessions:\n```xml\n\u003C!-- Info.plist -->\n\u003Ckey>NSLocationRequireExplicitServiceSession\u003C\u002Fkey>\n\u003Ctrue\u002F>\n```\n\n### Session Layering\n\nDon't replace sessions—layer them:\n\n```swift\n\u002F\u002F Base session for app\nlet baseSession = CLServiceSession(authorization: .whenInUse)\n\n\u002F\u002F Additional session when navigation feature active\nlet navSession = CLServiceSession(\n    authorization: .whenInUse,\n    fullAccuracyPurposeKey: \"Nav\"\n)\n\u002F\u002F Both sessions active simultaneously\n```\n\n### Diagnostic Properties\n\n```swift\nfor try await diagnostic in session.diagnostics {\n    if diagnostic.authorizationDenied {\n        \u002F\u002F User denied—offer alternative\n    }\n    if diagnostic.authorizationDeniedGlobally {\n        \u002F\u002F Location services off system-wide\n    }\n    if diagnostic.insufficientlyInUse {\n        \u002F\u002F Can't request auth (not foreground)\n    }\n    if diagnostic.alwaysAuthorizationDenied {\n        \u002F\u002F Always auth specifically denied\n    }\n    if !diagnostic.authorizationRequestInProgress {\n        \u002F\u002F Decision made (granted or denied)\n        break\n    }\n}\n```\n\n### Session Lifecycle\n\nSessions persist through:\n- App backgrounding\n- App suspension\n- App termination (Core Location tracks)\n\nOn relaunch, recreate sessions immediately in `didFinishLaunchingWithOptions`.\n\n---\n\n## Part 5: Authorization State Machine\n\n### Authorization Levels\n\n| Status | Description |\n|--------|-------------|\n| `.notDetermined` | User hasn't decided |\n| `.restricted` | Parental controls prevent access |\n| `.denied` | User explicitly refused |\n| `.authorizedWhenInUse` | Access while app active |\n| `.authorizedAlways` | Background access |\n\n### Accuracy Authorization\n\n| Value | Description |\n|-------|-------------|\n| `.fullAccuracy` | Precise location |\n| `.reducedAccuracy` | Approximate (~5km), updates every 15-20 min |\n\n### Required Info.plist Keys\n\n```xml\n\u003C!-- Required for When In Use -->\n\u003Ckey>NSLocationWhenInUseUsageDescription\u003C\u002Fkey>\n\u003Cstring>We need your location to show nearby places\u003C\u002Fstring>\n\n\u003C!-- Required for Always -->\n\u003Ckey>NSLocationAlwaysAndWhenInUseUsageDescription\u003C\u002Fkey>\n\u003Cstring>We track your location to send arrival reminders\u003C\u002Fstring>\n\n\u003C!-- Optional: default to reduced accuracy -->\n\u003Ckey>NSLocationDefaultAccuracyReduced\u003C\u002Fkey>\n\u003Ctrue\u002F>\n```\n\n### Legacy Authorization Pattern\n\n```swift\n@MainActor\nclass LocationManager: NSObject, CLLocationManagerDelegate {\n    private let manager = CLLocationManager()\n\n    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {\n        switch manager.authorizationStatus {\n        case .notDetermined:\n            manager.requestWhenInUseAuthorization()\n        case .authorizedWhenInUse, .authorizedAlways:\n            enableLocationFeatures()\n        case .denied, .restricted:\n            disableLocationFeatures()\n        @unknown default:\n            break\n        }\n    }\n}\n```\n\n---\n\n## Part 6: Background Location\n\n### Requirements\n\n1. **Background mode capability**: Signing & Capabilities → Background Modes → Location updates\n2. **Info.plist**: Adds `UIBackgroundModes` with `location` value\n3. **CLBackgroundActivitySession** or **LiveActivity**\n\n### CLBackgroundActivitySession\n\n```swift\n\u002F\u002F Create and HOLD reference (deallocation invalidates session)\nvar backgroundSession: CLBackgroundActivitySession?\n\nfunc startBackgroundTracking() {\n    \u002F\u002F Must start from foreground\n    backgroundSession = CLBackgroundActivitySession()\n\n    Task {\n        for try await update in CLLocationUpdate.liveUpdates() {\n            processUpdate(update)\n        }\n    }\n}\n\nfunc stopBackgroundTracking() {\n    backgroundSession?.invalidate()\n    backgroundSession = nil\n}\n```\n\n### Background Indicator\n\nBlue status bar\u002Fpill appears when:\n- App authorized as \"When In Use\"\n- App receiving location in background\n- CLBackgroundActivitySession active\n\n### App Lifecycle\n\n1. **Foreground → Background**: Session continues\n2. **Background → Suspended**: Session preserved, updates pause\n3. **Suspended → Terminated**: Core Location tracks session\n4. **Terminated → Background launch**: Recreate session immediately\n\n```swift\nfunc application(_ application: UIApplication,\n                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n    \u002F\u002F Recreate background session if was tracking\n    if wasTrackingLocation {\n        backgroundSession = CLBackgroundActivitySession()\n        startLocationUpdates()\n    }\n    return true\n}\n```\n\n---\n\n## Part 7: Legacy APIs (iOS 12-16)\n\n### CLLocationManager Delegate Pattern\n\n```swift\nclass LocationManager: NSObject, CLLocationManagerDelegate {\n    private let manager = CLLocationManager()\n\n    override init() {\n        super.init()\n        manager.delegate = self\n        manager.desiredAccuracy = kCLLocationAccuracyBest\n        manager.distanceFilter = 10 \u002F\u002F meters\n    }\n\n    func startUpdates() {\n        manager.startUpdatingLocation()\n    }\n\n    func stopUpdates() {\n        manager.stopUpdatingLocation()\n    }\n\n    func locationManager(_ manager: CLLocationManager,\n                        didUpdateLocations locations: [CLLocation]) {\n        guard let location = locations.last else { return }\n        \u002F\u002F Process location\n    }\n}\n```\n\n### Accuracy Constants\n\n| Constant | Accuracy | Battery Impact |\n|----------|----------|----------------|\n| `kCLLocationAccuracyBestForNavigation` | ~5m | Highest |\n| `kCLLocationAccuracyBest` | ~10m | Very High |\n| `kCLLocationAccuracyNearestTenMeters` | ~10m | High |\n| `kCLLocationAccuracyHundredMeters` | ~100m | Medium |\n| `kCLLocationAccuracyKilometer` | ~1km | Low |\n| `kCLLocationAccuracyThreeKilometers` | ~3km | Very Low |\n| `kCLLocationAccuracyReduced` | ~5km | Lowest |\n\n### Legacy Region Monitoring\n\n```swift\n\u002F\u002F Deprecated in iOS 17, use CLMonitor instead\nlet region = CLCircularRegion(\n    center: coordinate,\n    radius: 100,\n    identifier: \"MyRegion\"\n)\nregion.notifyOnEntry = true\nregion.notifyOnExit = true\nmanager.startMonitoring(for: region)\n```\n\n### Significant Location Changes\n\nLow-power alternative for coarse tracking:\n\n```swift\nmanager.startMonitoringSignificantLocationChanges()\n\u002F\u002F Updates ~500m movements, works in background\n```\n\n### Visit Monitoring\n\nDetect arrivals\u002Fdepartures:\n\n```swift\nmanager.startMonitoringVisits()\n\nfunc locationManager(_ manager: CLLocationManager, didVisit visit: CLVisit) {\n    let arrival = visit.arrivalDate\n    let departure = visit.departureDate\n    let coordinate = visit.coordinate\n}\n```\n\n---\n\n## Part 8: Geofencing Best Practices\n\n### Region Size\n\n- **Minimum effective radius**: ~100 meters\n- **Smaller regions**: May not trigger reliably\n- **Larger regions**: More reliable but less precise\n\n### 20-Region Limit Strategy\n\n```swift\n\u002F\u002F Dynamic region management\nfunc updateMonitoredRegions(userLocation: CLLocation) async {\n    let nearbyPOIs = fetchNearbyPOIs(around: userLocation, limit: 20)\n\n    \u002F\u002F Remove old regions\n    for id in await monitor.identifiers {\n        if !nearbyPOIs.contains(where: { $0.id == id }) {\n            await monitor.remove(id)\n        }\n    }\n\n    \u002F\u002F Add new regions\n    for poi in nearbyPOIs {\n        let condition = CLMonitor.CircularGeographicCondition(\n            center: poi.coordinate,\n            radius: 100\n        )\n        await monitor.add(condition, identifier: poi.id)\n    }\n}\n```\n\n### Entry\u002FExit Timing\n\n- **Entry**: Usually within seconds to minutes\n- **Exit**: May take 3-5 minutes after leaving\n- **Accuracy depends on**: Cell towers, WiFi, GPS availability\n\n### Persistence\n\n- Conditions persist across app launches\n- Must reinitialize monitor with same name on launch\n- Core Location wakes app for events\n\n---\n\n## Part 9: Testing and Simulation\n\n### Xcode Location Simulation\n\n1. Run on simulator\n2. Debug → Simulate Location → Choose location\n3. Or use custom GPX file\n\n### Custom GPX Route\n\n```xml\n\u003C?xml version=\"1.0\"?>\n\u003Cgpx version=\"1.1\">\n    \u003Cwpt lat=\"37.331686\" lon=\"-122.030656\">\n        \u003Ctime>2024-01-01T00:00:00Z\u003C\u002Ftime>\n    \u003C\u002Fwpt>\n    \u003Cwpt lat=\"37.332686\" lon=\"-122.031656\">\n        \u003Ctime>2024-01-01T00:00:10Z\u003C\u002Ftime>\n    \u003C\u002Fwpt>\n\u003C\u002Fgpx>\n```\n\n### Testing Authorization States\n\nSettings → Privacy & Security → Location Services:\n- Toggle app authorization\n- Toggle system-wide location services\n- Test reduced accuracy\n\n### Console Filtering\n\n```bash\n# Filter location logs\nlog stream --predicate 'subsystem == \"com.apple.locationd\"'\n```\n\n---\n\n## Part 10: Swift Concurrency Integration\n\n### Task Cancellation\n\n```swift\nlet locationTask = Task {\n    for try await update in CLLocationUpdate.liveUpdates() {\n        if Task.isCancelled { break }\n        processUpdate(update)\n    }\n}\n\n\u002F\u002F Later\nlocationTask.cancel()\n```\n\n### MainActor Considerations\n\n```swift\n@MainActor\nclass LocationViewModel: ObservableObject {\n    @Published var currentLocation: CLLocation?\n\n    func startTracking() {\n        Task {\n            for try await update in CLLocationUpdate.liveUpdates() {\n                \u002F\u002F Already on MainActor, safe to update @Published\n                self.currentLocation = update.location\n            }\n        }\n    }\n}\n```\n\n### Error Handling\n\n```swift\nTask {\n    do {\n        for try await update in CLLocationUpdate.liveUpdates() {\n            if update.authorizationDenied {\n                throw LocationError.authorizationDenied\n            }\n            processUpdate(update)\n        }\n    } catch {\n        handleError(error)\n    }\n}\n```\n\n---\n\n## Part 11: Geocoding\n\n### CLGeocoder — Forward Geocoding (Address → Coordinate)\n\n```swift\nlet geocoder = CLGeocoder()\n\nfunc geocodeAddress(_ address: String) async throws -> CLLocation? {\n    let placemarks = try await geocoder.geocodeAddressString(address)\n    return placemarks.first?.location\n}\n\n\u002F\u002F With locale for localized results\nlet placemarks = try await geocoder.geocodeAddressString(\n    \"1 Apple Park Way\",\n    in: nil,  \u002F\u002F CLRegion hint (optional)\n    preferredLocale: Locale(identifier: \"en_US\")\n)\n```\n\n### CLGeocoder — Reverse Geocoding (Coordinate → Address)\n\n```swift\nfunc reverseGeocode(_ location: CLLocation) async throws -> CLPlacemark? {\n    let placemarks = try await geocoder.reverseGeocodeLocation(location)\n    return placemarks.first\n}\n\n\u002F\u002F Usage\nif let placemark = try await reverseGeocode(location) {\n    let street = placemark.thoroughfare          \u002F\u002F \"Apple Park Way\"\n    let city = placemark.locality                \u002F\u002F \"Cupertino\"\n    let state = placemark.administrativeArea     \u002F\u002F \"CA\"\n    let zip = placemark.postalCode               \u002F\u002F \"95014\"\n    let country = placemark.country              \u002F\u002F \"United States\"\n    let isoCountry = placemark.isoCountryCode    \u002F\u002F \"US\"\n}\n```\n\n### CLPlacemark Key Properties\n\n| Property | Example | Notes |\n|----------|---------|-------|\n| `name` | \"Apple Park\" | Location name |\n| `thoroughfare` | \"Apple Park Way\" | Street name |\n| `subThoroughfare` | \"1\" | Street number |\n| `locality` | \"Cupertino\" | City |\n| `subLocality` | \"Silicon Valley\" | Neighborhood |\n| `administrativeArea` | \"CA\" | State\u002Fprovince |\n| `postalCode` | \"95014\" | ZIP\u002Fpostal code |\n| `country` | \"United States\" | Country name |\n| `isoCountryCode` | \"US\" | ISO country code |\n| `timeZone` | America\u002FLos_Angeles | Time zone |\n| `location` | CLLocation | Coordinate |\n\n### Geocoding Rate Limits\n\n- **One request at a time** — CLGeocoder throws if a request is in progress\n- **Apple rate-limits** — Throttle to avoid `kCLErrorGeocodeCanceled`\n- **Cache results** — Don't re-geocode the same address\u002Fcoordinate\n- **Batch carefully** — Add delays between sequential geocode requests\n\n```swift\n\u002F\u002F Check if geocoder is busy\nif geocoder.isGeocoding {\n    geocoder.cancelGeocode()  \u002F\u002F Cancel previous before starting new\n}\n```\n\n---\n\n## Troubleshooting Quick Reference\n\n| Symptom | Check |\n|---------|-------|\n| No location updates | Authorization status, Info.plist keys |\n| Background not working | Background mode capability, CLBackgroundActivitySession |\n| Always auth not effective | CLServiceSession with `.always`, started in foreground |\n| Geofence not triggering | Region count (max 20), radius (min ~100m) |\n| Reduced accuracy only | Check `accuracyAuthorization`, request temporary full accuracy |\n| Location icon stays on | Ensure `stopUpdatingLocation()` or break from async loop |\n\n---\n\n## Resources\n\n**WWDC**: 2023-10180, 2023-10147, 2024-10212\n\n**Docs**: \u002Fcorelocation, \u002Fcorelocation\u002Fclmonitor, \u002Fcorelocation\u002Fcllocationupdate, \u002Fcorelocation\u002Fclservicesession\n\n**Skills**: axiom-core-location, axiom-core-location-diag, axiom-energy-ref\n\n","# Core Location Reference\n\nComprehensive API reference for modern Core Location (iOS 17+).\n\n## When to Use\n\n- Need API signatures for CLLocationUpdate, CLMonitor, CLServiceSession\n- Implementing geofencing or region monitoring\n- Configuring background location updates\n- Understanding authorization patterns\n- Debugging location service issues\n\n## Related Skills\n\n- `axiom-core-location` — Anti-patterns, decision trees, pressure scenarios\n- `axiom-core-location-diag` — Symptom-based troubleshooting\n- `axiom-energy-ref` — Location as battery subsystem (accuracy vs power)\n\n---\n\n## Part 1: Modern API Overview (iOS 17+)\n\nFour key classes replace legacy CLLocationManager patterns:\n\n| Class | Purpose | iOS |\n|-------|---------|-----|\n| `CLLocationUpdate` | AsyncSequence for location updates | 17+ |\n| `CLMonitor` | Condition-based geofencing\u002Fbeacons | 17+ |\n| `CLServiceSession` | Declarative authorization goals | 18+ |\n| `CLBackgroundActivitySession` | Background location support | 17+ |\n\n**Migration path**: Legacy CLLocationManager still works, but new APIs provide:\n- Swift concurrency (async\u002Fawait)\n- Automatic pause\u002Fresume\n- Simplified authorization\n- Better battery efficiency\n\n---\n\n## Part 2: CLLocationUpdate API\n\n### Basic Usage\n\n```swift\nimport CoreLocation\n\nTask {\n    do {\n        for try await update in CLLocationUpdate.liveUpdates() {\n            if let location = update.location {\n                \u002F\u002F Process location\n            }\n            if update.isStationary {\n                break \u002F\u002F Stop when user stops moving\n            }\n        }\n    } catch {\n        \u002F\u002F Handle location errors\n    }\n}\n```\n\n### LiveConfiguration Options\n\n```swift\nCLLocationUpdate.liveUpdates(.default)\nCLLocationUpdate.liveUpdates(.automotiveNavigation)\nCLLocationUpdate.liveUpdates(.otherNavigation)\nCLLocationUpdate.liveUpdates(.fitness)\nCLLocationUpdate.liveUpdates(.airborne)\n```\n\nChoose based on use case. If unsure, use `.default` or omit parameter.\n\n### Key Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `location` | `CLLocation?` | Current location (nil if unavailable) |\n| `isStationary` | `Bool` | True when device stopped moving |\n| `authorizationDenied` | `Bool` | User denied location access |\n| `authorizationDeniedGlobally` | `Bool` | Location services disabled system-wide |\n| `authorizationRequestInProgress` | `Bool` | Awaiting user authorization decision |\n| `accuracyLimited` | `Bool` | Reduced accuracy (updates every 15-20 min) |\n| `locationUnavailable` | `Bool` | Cannot determine location |\n| `insufficientlyInUse` | `Bool` | Can't request auth (not in foreground) |\n\n### Automatic Pause\u002FResume\n\nWhen device becomes stationary:\n1. Final update delivered with `isStationary = true` and valid `location`\n2. Updates pause (saves battery)\n3. When device moves, updates resume with `isStationary = false`\n\nNo action required—happens automatically.\n\n### AsyncSequence Operations\n\n```swift\n\u002F\u002F Get first location with speed > 10 m\u002Fs\nlet fastUpdate = try await CLLocationUpdate.liveUpdates()\n    .first { $0.location?.speed ?? 0 > 10 }\n\n\u002F\u002F WARNING: Avoid filters that may never match (e.g., horizontalAccuracy \u003C 1)\n```\n\n---\n\n## Part 3: CLMonitor API\n\nSwift actor for monitoring geographic conditions and beacons.\n\n### Basic Geofencing\n\n```swift\nlet monitor = await CLMonitor(\"MyMonitor\")\n\n\u002F\u002F Add circular region\nlet condition = CLMonitor.CircularGeographicCondition(\n    center: CLLocationCoordinate2D(latitude: 37.33, longitude: -122.01),\n    radius: 100\n)\nawait monitor.add(condition, identifier: \"ApplePark\")\n\n\u002F\u002F Await events\nfor try await event in monitor.events {\n    switch event.state {\n    case .satisfied:  \u002F\u002F User entered region\n        handleEntry(event.identifier)\n    case .unsatisfied:  \u002F\u002F User exited region\n        handleExit(event.identifier)\n    case .unknown:\n        break\n    @unknown default:\n        break\n    }\n}\n```\n\n### CircularGeographicCondition\n\n```swift\nCLMonitor.CircularGeographicCondition(\n    center: CLLocationCoordinate2D,\n    radius: CLLocationDistance  \u002F\u002F meters, minimum ~100m effective\n)\n```\n\n### BeaconIdentityCondition\n\nThree granularity levels:\n\n```swift\n\u002F\u002F All beacons with UUID (any site)\nCLMonitor.BeaconIdentityCondition(uuid: myUUID)\n\n\u002F\u002F Specific site (UUID + major)\nCLMonitor.BeaconIdentityCondition(uuid: myUUID, major: 100)\n\n\u002F\u002F Specific beacon (UUID + major + minor)\nCLMonitor.BeaconIdentityCondition(uuid: myUUID, major: 100, minor: 5)\n```\n\n### Condition Limit\n\n**Maximum 20 conditions per app.** Prioritize what to monitor. Swap regions dynamically based on user location if needed.\n\n### Adding with Assumed State\n\n```swift\n\u002F\u002F If you know initial state\nawait monitor.add(condition, identifier: \"Work\", assuming: .unsatisfied)\n```\n\nCore Location will correct if assumption wrong.\n\n### Accessing Records\n\n```swift\n\u002F\u002F Get single record\nif let record = await monitor.record(for: \"ApplePark\") {\n    let condition = record.condition\n    let lastEvent = record.lastEvent\n    let state = lastEvent.state\n    let date = lastEvent.date\n}\n\n\u002F\u002F Get all identifiers\nlet allIds = await monitor.identifiers\n```\n\n### Event Properties\n\n| Property | Description |\n|----------|-------------|\n| `identifier` | String identifier of condition |\n| `state` | `.satisfied`, `.unsatisfied`, `.unknown` |\n| `date` | When state changed |\n| `refinement` | For wildcard beacons, actual UUID\u002Fmajor\u002Fminor detected |\n| `conditionLimitExceeded` | Too many conditions (max 20) |\n| `conditionUnsupported` | Condition type not available |\n| `accuracyLimited` | Reduced accuracy prevents monitoring |\n\n### Critical Requirements\n\n1. **One monitor per name** — Only one instance with given name at a time\n2. **Always await events** — Events only become `lastEvent` after handling\n3. **Reinitialize on launch** — Recreate monitor in `didFinishLaunchingWithOptions`\n\n---\n\n## Part 4: CLServiceSession API (iOS 18+)\n\nDeclarative authorization—tell Core Location what you need, not what to do.\n\n### Basic Usage\n\n```swift\n\u002F\u002F Hold session for duration of feature\nlet session = CLServiceSession(authorization: .whenInUse)\n\nfor try await update in CLLocationUpdate.liveUpdates() {\n    \u002F\u002F Process updates\n}\n```\n\n### Authorization Requirements\n\n```swift\nCLServiceSession(authorization: .none)       \u002F\u002F No auth request\nCLServiceSession(authorization: .whenInUse)  \u002F\u002F Request When In Use\nCLServiceSession(authorization: .always)     \u002F\u002F Request Always (must start in foreground)\n```\n\n### Full Accuracy Request\n\n```swift\n\u002F\u002F For features requiring precise location (e.g., navigation)\nCLServiceSession(\n    authorization: .whenInUse,\n    fullAccuracyPurposeKey: \"NavigationPurpose\"  \u002F\u002F Key in Info.plist\n)\n```\n\nRequires `NSLocationTemporaryUsageDescriptionDictionary` in Info.plist.\n\n### Implicit Sessions\n\nIterating `CLLocationUpdate.liveUpdates()` or `CLMonitor.events` creates implicit session with `.whenInUse` goal.\n\nTo disable implicit sessions:\n```xml\n\u003C!-- Info.plist -->\n\u003Ckey>NSLocationRequireExplicitServiceSession\u003C\u002Fkey>\n\u003Ctrue\u002F>\n```\n\n### Session Layering\n\nDon't replace sessions—layer them:\n\n```swift\n\u002F\u002F Base session for app\nlet baseSession = CLServiceSession(authorization: .whenInUse)\n\n\u002F\u002F Additional session when navigation feature active\nlet navSession = CLServiceSession(\n    authorization: .whenInUse,\n    fullAccuracyPurposeKey: \"Nav\"\n)\n\u002F\u002F Both sessions active simultaneously\n```\n\n### Diagnostic Properties\n\n```swift\nfor try await diagnostic in session.diagnostics {\n    if diagnostic.authorizationDenied {\n        \u002F\u002F User denied—offer alternative\n    }\n    if diagnostic.authorizationDeniedGlobally {\n        \u002F\u002F Location services off system-wide\n    }\n    if diagnostic.insufficientlyInUse {\n        \u002F\u002F Can't request auth (not foreground)\n    }\n    if diagnostic.alwaysAuthorizationDenied {\n        \u002F\u002F Always auth specifically denied\n    }\n    if !diagnostic.authorizationRequestInProgress {\n        \u002F\u002F Decision made (granted or denied)\n        break\n    }\n}\n```\n\n### Session Lifecycle\n\nSessions persist through:\n- App backgrounding\n- App suspension\n- App termination (Core Location tracks)\n\nOn relaunch, recreate sessions immediately in `didFinishLaunchingWithOptions`.\n\n---\n\n## Part 5: Authorization State Machine\n\n### Authorization Levels\n\n| Status | Description |\n|--------|-------------|\n| `.notDetermined` | User hasn't decided |\n| `.restricted` | Parental controls prevent access |\n| `.denied` | User explicitly refused |\n| `.authorizedWhenInUse` | Access while app active |\n| `.authorizedAlways` | Background access |\n\n### Accuracy Authorization\n\n| Value | Description |\n|-------|-------------|\n| `.fullAccuracy` | Precise location |\n| `.reducedAccuracy` | Approximate (~5km), updates every 15-20 min |\n\n### Required Info.plist Keys\n\n```xml\n\u003C!-- Required for When In Use -->\n\u003Ckey>NSLocationWhenInUseUsageDescription\u003C\u002Fkey>\n\u003Cstring>We need your location to show nearby places\u003C\u002Fstring>\n\n\u003C!-- Required for Always -->\n\u003Ckey>NSLocationAlwaysAndWhenInUseUsageDescription\u003C\u002Fkey>\n\u003Cstring>We track your location to send arrival reminders\u003C\u002Fstring>\n\n\u003C!-- Optional: default to reduced accuracy -->\n\u003Ckey>NSLocationDefaultAccuracyReduced\u003C\u002Fkey>\n\u003Ctrue\u002F>\n```\n\n### Legacy Authorization Pattern\n\n```swift\n@MainActor\nclass LocationManager: NSObject, CLLocationManagerDelegate {\n    private let manager = CLLocationManager()\n\n    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {\n        switch manager.authorizationStatus {\n        case .notDetermined:\n            manager.requestWhenInUseAuthorization()\n        case .authorizedWhenInUse, .authorizedAlways:\n            enableLocationFeatures()\n        case .denied, .restricted:\n            disableLocationFeatures()\n        @unknown default:\n            break\n        }\n    }\n}\n```\n\n---\n\n## Part 6: Background Location\n\n### Requirements\n\n1. **Background mode capability**: Signing & Capabilities → Background Modes → Location updates\n2. **Info.plist**: Adds `UIBackgroundModes` with `location` value\n3. **CLBackgroundActivitySession** or **LiveActivity**\n\n### CLBackgroundActivitySession\n\n```swift\n\u002F\u002F Create and HOLD reference (deallocation invalidates session)\nvar backgroundSession: CLBackgroundActivitySession?\n\nfunc startBackgroundTracking() {\n    \u002F\u002F Must start from foreground\n    backgroundSession = CLBackgroundActivitySession()\n\n    Task {\n        for try await update in CLLocationUpdate.liveUpdates() {\n            processUpdate(update)\n        }\n    }\n}\n\nfunc stopBackgroundTracking() {\n    backgroundSession?.invalidate()\n    backgroundSession = nil\n}\n```\n\n### Background Indicator\n\nBlue status bar\u002Fpill appears when:\n- App authorized as \"When In Use\"\n- App receiving location in background\n- CLBackgroundActivitySession active\n\n### App Lifecycle\n\n1. **Foreground → Background**: Session continues\n2. **Background → Suspended**: Session preserved, updates pause\n3. **Suspended → Terminated**: Core Location tracks session\n4. **Terminated → Background launch**: Recreate session immediately\n\n```swift\nfunc application(_ application: UIApplication,\n                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n    \u002F\u002F Recreate background session if was tracking\n    if wasTrackingLocation {\n        backgroundSession = CLBackgroundActivitySession()\n        startLocationUpdates()\n    }\n    return true\n}\n```\n\n---\n\n## Part 7: Legacy APIs (iOS 12-16)\n\n### CLLocationManager Delegate Pattern\n\n```swift\nclass LocationManager: NSObject, CLLocationManagerDelegate {\n    private let manager = CLLocationManager()\n\n    override init() {\n        super.init()\n        manager.delegate = self\n        manager.desiredAccuracy = kCLLocationAccuracyBest\n        manager.distanceFilter = 10 \u002F\u002F meters\n    }\n\n    func startUpdates() {\n        manager.startUpdatingLocation()\n    }\n\n    func stopUpdates() {\n        manager.stopUpdatingLocation()\n    }\n\n    func locationManager(_ manager: CLLocationManager,\n                        didUpdateLocations locations: [CLLocation]) {\n        guard let location = locations.last else { return }\n        \u002F\u002F Process location\n    }\n}\n```\n\n### Accuracy Constants\n\n| Constant | Accuracy | Battery Impact |\n|----------|----------|----------------|\n| `kCLLocationAccuracyBestForNavigation` | ~5m | Highest |\n| `kCLLocationAccuracyBest` | ~10m | Very High |\n| `kCLLocationAccuracyNearestTenMeters` | ~10m | High |\n| `kCLLocationAccuracyHundredMeters` | ~100m | Medium |\n| `kCLLocationAccuracyKilometer` | ~1km | Low |\n| `kCLLocationAccuracyThreeKilometers` | ~3km | Very Low |\n| `kCLLocationAccuracyReduced` | ~5km | Lowest |\n\n### Legacy Region Monitoring\n\n```swift\n\u002F\u002F Deprecated in iOS 17, use CLMonitor instead\nlet region = CLCircularRegion(\n    center: coordinate,\n    radius: 100,\n    identifier: \"MyRegion\"\n)\nregion.notifyOnEntry = true\nregion.notifyOnExit = true\nmanager.startMonitoring(for: region)\n```\n\n### Significant Location Changes\n\nLow-power alternative for coarse tracking:\n\n```swift\nmanager.startMonitoringSignificantLocationChanges()\n\u002F\u002F Updates ~500m movements, works in background\n```\n\n### Visit Monitoring\n\nDetect arrivals\u002Fdepartures:\n\n```swift\nmanager.startMonitoringVisits()\n\nfunc locationManager(_ manager: CLLocationManager, didVisit visit: CLVisit) {\n    let arrival = visit.arrivalDate\n    let departure = visit.departureDate\n    let coordinate = visit.coordinate\n}\n```\n\n---\n\n## Part 8: Geofencing Best Practices\n\n### Region Size\n\n- **Minimum effective radius**: ~100 meters\n- **Smaller regions**: May not trigger reliably\n- **Larger regions**: More reliable but less precise\n\n### 20-Region Limit Strategy\n\n```swift\n\u002F\u002F Dynamic region management\nfunc updateMonitoredRegions(userLocation: CLLocation) async {\n    let nearbyPOIs = fetchNearbyPOIs(around: userLocation, limit: 20)\n\n    \u002F\u002F Remove old regions\n    for id in await monitor.identifiers {\n        if !nearbyPOIs.contains(where: { $0.id == id }) {\n            await monitor.remove(id)\n        }\n    }\n\n    \u002F\u002F Add new regions\n    for poi in nearbyPOIs {\n        let condition = CLMonitor.CircularGeographicCondition(\n            center: poi.coordinate,\n            radius: 100\n        )\n        await monitor.add(condition, identifier: poi.id)\n    }\n}\n```\n\n### Entry\u002FExit Timing\n\n- **Entry**: Usually within seconds to minutes\n- **Exit**: May take 3-5 minutes after leaving\n- **Accuracy depends on**: Cell towers, WiFi, GPS availability\n\n### Persistence\n\n- Conditions persist across app launches\n- Must reinitialize monitor with same name on launch\n- Core Location wakes app for events\n\n---\n\n## Part 9: Testing and Simulation\n\n### Xcode Location Simulation\n\n1. Run on simulator\n2. Debug → Simulate Location → Choose location\n3. Or use custom GPX file\n\n### Custom GPX Route\n\n```xml\n\u003C?xml version=\"1.0\"?>\n\u003Cgpx version=\"1.1\">\n    \u003Cwpt lat=\"37.331686\" lon=\"-122.030656\">\n        \u003Ctime>2024-01-01T00:00:00Z\u003C\u002Ftime>\n    \u003C\u002Fwpt>\n    \u003Cwpt lat=\"37.332686\" lon=\"-122.031656\">\n        \u003Ctime>2024-01-01T00:00:10Z\u003C\u002Ftime>\n    \u003C\u002Fwpt>\n\u003C\u002Fgpx>\n```\n\n### Testing Authorization States\n\nSettings → Privacy & Security → Location Services:\n- Toggle app authorization\n- Toggle system-wide location services\n- Test reduced accuracy\n\n### Console Filtering\n\n```bash\n# Filter location logs\nlog stream --predicate 'subsystem == \"com.apple.locationd\"'\n```\n\n---\n\n## Part 10: Swift Concurrency Integration\n\n### Task Cancellation\n\n```swift\nlet locationTask = Task {\n    for try await update in CLLocationUpdate.liveUpdates() {\n        if Task.isCancelled { break }\n        processUpdate(update)\n    }\n}\n\n\u002F\u002F Later\nlocationTask.cancel()\n```\n\n### MainActor Considerations\n\n```swift\n@MainActor\nclass LocationViewModel: ObservableObject {\n    @Published var currentLocation: CLLocation?\n\n    func startTracking() {\n        Task {\n            for try await update in CLLocationUpdate.liveUpdates() {\n                \u002F\u002F Already on MainActor, safe to update @Published\n                self.currentLocation = update.location\n            }\n        }\n    }\n}\n```\n\n### Error Handling\n\n```swift\nTask {\n    do {\n        for try await update in CLLocationUpdate.liveUpdates() {\n            if update.authorizationDenied {\n                throw LocationError.authorizationDenied\n            }\n            processUpdate(update)\n        }\n    } catch {\n        handleError(error)\n    }\n}\n```\n\n---\n\n## Part 11: Geocoding\n\n### CLGeocoder — Forward Geocoding (Address → Coordinate)\n\n```swift\nlet geocoder = CLGeocoder()\n\nfunc geocodeAddress(_ address: String) async throws -> CLLocation? {\n    let placemarks = try await geocoder.geocodeAddressString(address)\n    return placemarks.first?.location\n}\n\n\u002F\u002F With locale for localized results\nlet placemarks = try await geocoder.geocodeAddressString(\n    \"1 Apple Park Way\",\n    in: nil,  \u002F\u002F CLRegion hint (optional)\n    preferredLocale: Locale(identifier: \"en_US\")\n)\n```\n\n### CLGeocoder — Reverse Geocoding (Coordinate → Address)\n\n```swift\nfunc reverseGeocode(_ location: CLLocation) async throws -> CLPlacemark? {\n    let placemarks = try await geocoder.reverseGeocodeLocation(location)\n    return placemarks.first\n}\n\n\u002F\u002F Usage\nif let placemark = try await reverseGeocode(location) {\n    let street = placemark.thoroughfare          \u002F\u002F \"Apple Park Way\"\n    let city = placemark.locality                \u002F\u002F \"Cupertino\"\n    let state = placemark.administrativeArea     \u002F\u002F \"CA\"\n    let zip = placemark.postalCode               \u002F\u002F \"95014\"\n    let country = placemark.country              \u002F\u002F \"United States\"\n    let isoCountry = placemark.isoCountryCode    \u002F\u002F \"US\"\n}\n```\n\n### CLPlacemark Key Properties\n\n| Property | Example | Notes |\n|----------|---------|-------|\n| `name` | \"Apple Park\" | Location name |\n| `thoroughfare` | \"Apple Park Way\" | Street name |\n| `subThoroughfare` | \"1\" | Street number |\n| `locality` | \"Cupertino\" | City |\n| `subLocality` | \"Silicon Valley\" | Neighborhood |\n| `administrativeArea` | \"CA\" | State\u002Fprovince |\n| `postalCode` | \"95014\" | ZIP\u002Fpostal code |\n| `country` | \"United States\" | Country name |\n| `isoCountryCode` | \"US\" | ISO country code |\n| `timeZone` | America\u002FLos_Angeles | Time zone |\n| `location` | CLLocation | Coordinate |\n\n### Geocoding Rate Limits\n\n- **One request at a time** — CLGeocoder throws if a request is in progress\n- **Apple rate-limits** — Throttle to avoid `kCLErrorGeocodeCanceled`\n- **Cache results** — Don't re-geocode the same address\u002Fcoordinate\n- **Batch carefully** — Add delays between sequential geocode requests\n\n```swift\n\u002F\u002F Check if geocoder is busy\nif geocoder.isGeocoding {\n    geocoder.cancelGeocode()  \u002F\u002F Cancel previous before starting new\n}\n```\n\n---\n\n## Troubleshooting Quick Reference\n\n| Symptom | Check |\n|---------|-------|\n| No location updates | Authorization status, Info.plist keys |\n| Background not working | Background mode capability, CLBackgroundActivitySession |\n| Always auth not effective | CLServiceSession with `.always`, started in foreground |\n| Geofence not triggering | Region count (max 20), radius (min ~100m) |\n| Reduced accuracy only | Check `accuracyAuthorization`, request temporary full accuracy |\n| Location icon stays on | Ensure `stopUpdatingLocation()` or break from async loop |\n\n---\n\n## Resources\n\n**WWDC**: 2023-10180, 2023-10147, 2024-10212\n\n**Docs**: \u002Fcorelocation, \u002Fcorelocation\u002Fclmonitor, \u002Fcorelocation\u002Fcllocationupdate, \u002Fcorelocation\u002Fclservicesession\n\n**Skills**: axiom-core-location, axiom-core-location-diag, axiom-energy-ref\n\n",{"name":5,"license":15,"metadata":38,"description":7,"compatibility":41},{"version":39,"last-updated":40},"1.0.0","2026-01-03","iOS 17+, iPadOS 17+, macOS 14+, watchOS 10+","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FCharlesWiltgen\u002FAxiom\u002Faxiom-core-location-ref",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill axiom-core-location-ref",{"tool":57,"command":58},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill axiom-core-location-ref",{"tool":60,"command":61},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill axiom-core-location-ref","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FCharlesWiltgen\u002FAxiom\u002Faxiom-core-location-ref\u002FSKILL.md",true,[],[66,80,90,99,105,112],{"skillNo":67,"name":68,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":76,"publishedAt":33},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[71],{"categoryNo":72,"categoryName":73,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[77,78,79],"model","model hierarchy","model hierarchy skill",{"skillNo":81,"name":82,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":86,"publishedAt":33},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[85],{"categoryNo":72,"categoryName":73,"taxonomyType":74,"taxonomyTypeDesc":75},[87,88,89],"MCP","zoom","zoom mcp",{"skillNo":91,"name":92,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":33},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[96,97,98,88],"sdk","zoom apps sdk","apps",{"skillNo":100,"name":101,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":33},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[101],{"skillNo":106,"name":107,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":111,"publishedAt":33},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[110],{"categoryNo":72,"categoryName":73,"taxonomyType":74,"taxonomyTypeDesc":75},[107],{"skillNo":113,"name":114,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":33},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[114]]