Geolocation
#Overview
The Geolocation API provides access to the device's GPS and location services to determine the user's current position.
Import
Copied!
use Native\Mobile\Facades\Geolocation;
Copied!
import { geolocation, on, off, Events } from '#nativephp';
#Methods
#getCurrentPosition()
Gets the current GPS location of the device.
Parameters:
bool $fineAccuracy- Whether to use high accuracy mode (GPS vs network) (default:false)
Returns: Location data via events
Get Current Position
Copied!
// Get location using network positioning (faster, less accurate)Geolocation::getCurrentPosition(); // Get location using GPS (slower, more accurate)Geolocation::getCurrentPosition(true);
Copied!
// Get location using network positioning (faster, less accurate)await geolocation.getCurrentPosition(); // Get location using GPS (slower, more accurate)await geolocation.getCurrentPosition() .fineAccuracy(true); // With identifier for trackingawait geolocation.getCurrentPosition() .fineAccuracy(true) .id('current-loc');
#checkPermissions()
Checks the current location permissions status.
Returns: Permission status via events
Check Permissions
Copied!
Geolocation::checkPermissions();
Copied!
await geolocation.checkPermissions();
#requestPermissions()
Requests location permissions from the user.
Returns: Permission status after request via events
Request Permissions
Copied!
Geolocation::requestPermissions();
Copied!
await geolocation.requestPermissions(); // With remember flagawait geolocation.requestPermissions() .remember();
#Events
#LocationReceived
Fired when location data is requested (success or failure).
Event Parameters:
bool $success- Whether location was successfully retrievedfloat $latitude- Latitude coordinate (when successful)float $longitude- Longitude coordinate (when successful)float $accuracy- Accuracy in meters (when successful)int $timestamp- Unix timestamp of location fixstring $provider- Location provider used (GPS, network, etc.)string $error- Error message (when unsuccessful)
LocationReceived Event
Copied!
use Native\Mobile\Attributes\OnNative;use Native\Mobile\Events\Geolocation\LocationReceived; #[OnNative(LocationReceived::class)]public function handleLocationReceived( $success = null, $latitude = null, $longitude = null, $accuracy = null, $timestamp = null, $provider = null, $error = null) { // ...}
Copied!
import { on, off, Events } from '#nativephp';import { ref, onMounted, onUnmounted } from 'vue'; const location = ref({ latitude: null, longitude: null });const error = ref(''); const handleLocationReceived = (payload) => { if (payload.success) { location.value = { latitude: payload.latitude, longitude: payload.longitude }; } else { error.value = payload.error; }}; onMounted(() => { on(Events.Geolocation.LocationReceived, handleLocationReceived);}); onUnmounted(() => { off(Events.Geolocation.LocationReceived, handleLocationReceived);});
Copied!
import { on, off, Events } from '#nativephp';import { useState, useEffect } from 'react'; const [location, setLocation] = useState({ latitude: null, longitude: null });const [error, setError] = useState(''); const handleLocationReceived = (payload) => { if (payload.success) { setLocation({ latitude: payload.latitude, longitude: payload.longitude }); } else { setError(payload.error); }}; useEffect(() => { on(Events.Geolocation.LocationReceived, handleLocationReceived); return () => { off(Events.Geolocation.LocationReceived, handleLocationReceived); };}, []);
#PermissionStatusReceived
Fired when permission status is checked.
Event Parameters:
string $location- Overall location permission statusstring $coarseLocation- Coarse location permission statusstring $fineLocation- Fine location permission status
Permission Values:
'granted'- Permission is granted'denied'- Permission is denied'not_determined'- Permission not yet requested
PermissionStatusReceived Event
Copied!
use Native\Mobile\Attributes\OnNative;use Native\Mobile\Events\Geolocation\PermissionStatusReceived; #[OnNative(PermissionStatusReceived::class)]public function handlePermissionStatus($location, $coarseLocation, $fineLocation){ // ...}
Copied!
import { on, off, Events } from '#nativephp';import { ref, onMounted, onUnmounted } from 'vue'; const permissionStatus = ref(''); const handlePermissionStatus = (payload) => { const { location } = payload; permissionStatus.value = location;}; onMounted(() => { on(Events.Geolocation.PermissionStatusReceived, handlePermissionStatus);}); onUnmounted(() => { off(Events.Geolocation.PermissionStatusReceived, handlePermissionStatus);});
Copied!
import { on, off, Events } from '#nativephp';import { useState, useEffect } from 'react'; const [permissionStatus, setPermissionStatus] = useState(''); const handlePermissionStatus = (payload) => { const { location } = payload; setPermissionStatus(location);}; useEffect(() => { on(Events.Geolocation.PermissionStatusReceived, handlePermissionStatus); return () => { off(Events.Geolocation.PermissionStatusReceived, handlePermissionStatus); };}, []);
#PermissionRequestResult
Fired when a permission request completes.
Event Parameters:
string $location- Overall location permission resultstring $coarseLocation- Coarse location permission resultstring $fineLocation- Fine location permission resultstring $message- Optional message (for permanently denied)bool $needsSettings- Whether user needs to go to Settings
Special Values:
'permanently_denied'- User has permanently denied permission
PermissionRequestResult Event
Copied!
use Native\Mobile\Attributes\OnNative;use Native\Mobile\Events\Geolocation\PermissionRequestResult; #[On('native:' . PermissionRequestResult::class)]public function handlePermissionRequest($location, $coarseLocation, $fineLocation, $message = null, $needsSettings = null){ if ($location === 'permanently_denied') { $this->error = 'Location permission permanently denied. Please enable in Settings.'; } elseif ($coarseLocation === 'granted' || $fineLocation === 'granted') { $this->getCurrentLocation(); } else { $this->error = 'Location permission is required for this feature.'; }}
Copied!
import { on, off, Events } from '#nativephp';import { ref, onMounted, onUnmounted } from 'vue'; const error = ref(''); const handlePermissionRequest = (payload) => { const { location, coarseLocation, fineLocation } = payload; if (location === 'permanently_denied') { error.value = 'Please enable location in Settings.'; } else if (coarseLocation === 'granted' || fineLocation === 'granted') { getCurrentLocation(); } else { error.value = 'Location permission is required.'; }}; onMounted(() => { on(Events.Geolocation.PermissionRequestResult, handlePermissionRequest);}); onUnmounted(() => { off(Events.Geolocation.PermissionRequestResult, handlePermissionRequest);});
Copied!
import { on, off, Events } from '#nativephp';import { useState, useEffect } from 'react'; const [error, setError] = useState(''); const handlePermissionRequest = (payload) => { const { location, coarseLocation, fineLocation } = payload; if (location === 'permanently_denied') { setError('Please enable location in Settings.'); } else if (coarseLocation === 'granted' || fineLocation === 'granted') { getCurrentLocation(); } else { setError('Location permission is required.'); }}; useEffect(() => { on(Events.Geolocation.PermissionRequestResult, handlePermissionRequest); return () => { off(Events.Geolocation.PermissionRequestResult, handlePermissionRequest); };}, []);
#Privacy Considerations
- Explain why you need location access before requesting
- Request at the right time - when the feature is actually needed
- Respect denials - provide alternative functionality when possible
- Use appropriate accuracy - don't request fine location if coarse is sufficient
- Limit frequency - don't request location updates constantly
#Performance Considerations
- Battery Usage - GPS uses more battery than network location
- Time to Fix - GPS takes longer for initial position
- Indoor Accuracy - GPS may not work well indoors
- Caching - Consider caching recent locations for better UX