Proof
No visual proof cases have been published for this package yet. The registry summary below describes what the compat layer implements.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 registry90%
API coverageWorking (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