Proof

expo-location

the published SDK 58 package (verified against 58.0.12) runs unchanged against one ExpoLocation native seam backed by host browser geolocation and the shared app-scoped permission registry
90%
API coverage
No visual proof cases have been published for this package yet. The registry summary below describes what the compat layer implements.
Working (10)
upstream enumsvalidationsubscriber bookkeeping and permission hooks; native exception codes and reasons; getProviderStatusAsync with backgroundModeEnabled always true like native on ios and the full five-key LocationProviderStatus on android; ios start* gated on the location UIBackgroundModes from the resolved expo config (infoPlist modes or the expo-location plugin flag)unavailable when undeclared; getCurrentPositionAsyncforeground-gated filtered getLastKnownPositionAsyncwatchPositionAsync with native watch-id event routing and removalios terminal permission-revocation error and android silent permission loss; ios significant-change delivery alongside ordinary updates (500 meters and five minutes, independent of distanceInterval); android foregroundService startup gates for foreground/background authorizationapp foreground state and API-level manifest permissions; foreground/background permission getters and requests; hasServicesEnabledAsync; isBackgroundLocationAvailableAsync=true; simulator-exact motion-activity unavailability; background location task registration and { locations } delivery through the task-manager seam with distanceInterval filteringdeferred background batching (deferredUpdatesInterval and deferredUpdatesDistance, foreground no-deferral, android resume flush and timestamp dedup) and ios task error delivery ({ code, message } from didFailWithError and permission revocation; android stays silent like native); heading via the shared DeviceOrientationEvent source (webkitCompassHeading else clockwise alpha, accuracy exactly as the source supports) with the ios resolve-plus-Expo.locationError unavailable contract and the android silent single-watch throttle; geocodeAsync/reverseGeocodeAsync reporting each platform unavailable path (ios ERR_GEOCODING_NETWORK as the declared offline CLGeocoder does, android ERR_NO_GEOCODE after the permission gate — upstream exposes no provider selection since the Google option was removed in SDK 51); android enableNetworkProviderAsync resolving as the enabled provider does; startGeofencingAsync rejecting with ERR_GEOFENCING_UNAVAILABLE after the background permission checkas the reference iOS 27 simulator does (CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) is false there)
Missing
showsBackgroundLocationIndicator, activityType and pausesUpdatesAutomatically ride in task options without native effect; android foregroundService notification rendering and killServiceOnDestroy need a native service/task-removal lifecycle; live compass readings need a window tenant with a sensor source — the worker tenant reports the exact unavailable contract; android trueHeading is magHeading plus the AOSP GeomagneticField WMM-2020 declination at the last known location (-1 until a location is known, as upstream); ios trueHeading uses the same WMM declination as INFERRED parity because Apple does not publish its model, and is -1 without a known location