Geolocation: coarse fallback + clearer native error copy (v1.0.75)
The native Geolocation fix only takes effect once the APK is rebuilt — the current phone build still uses navigator.geolocation, hence the error. To make the rebuilt version more robust: - If a high-accuracy fix fails/times out (common indoors or weak GPS), retry with a coarse (network/wifi) fix and a longer window before giving up. This rescues most "Location unavailable" cases. - On native, the "unavailable" toast now tells the user to turn on Location/GPS AND allow the app permission, instead of the generic web message. Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
This commit is contained in:
parent
04b8b0a8b1
commit
59493ac784
3 changed files with 26 additions and 9 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "skate-spots",
|
"name": "skate-spots",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.74",
|
"version": "1.0.75",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"homepage": "https://skate-spots.com",
|
"homepage": "https://skate-spots.com",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
||||||
|
|
@ -99,12 +99,27 @@ export async function getCurrentPosition(): Promise<GeoCoords> {
|
||||||
throw new GeolocationError('denied', 'Location permission denied.');
|
throw new GeolocationError('denied', 'Location permission denied.');
|
||||||
}
|
}
|
||||||
|
|
||||||
const pos = await native.getCurrentPosition({
|
// First try a precise fix. High accuracy can fail/time out indoors or
|
||||||
enableHighAccuracy: true,
|
// with a weak GPS signal, which shows up as "unavailable" or "timeout".
|
||||||
timeout: 10000,
|
try {
|
||||||
maximumAge: 30000,
|
const pos = await native.getCurrentPosition({
|
||||||
});
|
enableHighAccuracy: true,
|
||||||
return { lat: pos.coords.latitude, lng: pos.coords.longitude };
|
timeout: 10000,
|
||||||
|
maximumAge: 30000,
|
||||||
|
});
|
||||||
|
return { lat: pos.coords.latitude, lng: pos.coords.longitude };
|
||||||
|
} catch (highAccErr) {
|
||||||
|
// Fall back to a coarse (network/cell/wifi) fix with a longer window.
|
||||||
|
// This rescues the common "GPS can't lock" case that otherwise looks
|
||||||
|
// like a hard failure.
|
||||||
|
console.warn('[geolocation] high-accuracy failed, trying coarse:', highAccErr);
|
||||||
|
const pos = await native.getCurrentPosition({
|
||||||
|
enableHighAccuracy: false,
|
||||||
|
timeout: 20000,
|
||||||
|
maximumAge: 120000,
|
||||||
|
});
|
||||||
|
return { lat: pos.coords.latitude, lng: pos.coords.longitude };
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err instanceof GeolocationError) throw err;
|
if (err instanceof GeolocationError) throw err;
|
||||||
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
||||||
|
|
@ -114,7 +129,7 @@ export async function getCurrentPosition(): Promise<GeoCoords> {
|
||||||
if (msg.includes('timeout') || msg.includes('timed out')) {
|
if (msg.includes('timeout') || msg.includes('timed out')) {
|
||||||
throw new GeolocationError('timeout', 'Location request timed out.');
|
throw new GeolocationError('timeout', 'Location request timed out.');
|
||||||
}
|
}
|
||||||
// "location disabled", "unavailable", etc.
|
// "location disabled", "unavailable", plugin-not-implemented, etc.
|
||||||
throw new GeolocationError('unavailable', err instanceof Error ? err.message : 'Location unavailable.');
|
throw new GeolocationError('unavailable', err instanceof Error ? err.message : 'Location unavailable.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -665,7 +665,9 @@ export default function MapPage() {
|
||||||
setNearMeError('unavailable');
|
setNearMeError('unavailable');
|
||||||
toast({
|
toast({
|
||||||
title: 'Location unavailable',
|
title: 'Location unavailable',
|
||||||
description: 'Your location could not be determined. Make sure location services are enabled.',
|
description: isNativeGeolocation()
|
||||||
|
? 'Turn on Location/GPS in your phone settings, allow location for SkateSpots (Settings → Apps → SkateSpots → Permissions), then try again.'
|
||||||
|
: 'Your location could not be determined. Make sure location services are enabled.',
|
||||||
variant: 'destructive',
|
variant: 'destructive',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue