Packages
mob
0.6.13
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.2
0.6.1
0.6.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.11
0.5.10
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
BEAM-on-device mobile framework for Elixir
Current section
Files
Jump to
Current section
Files
lib/mob/location.ex
defmodule Mob.Location do
@moduledoc """
Device location (GPS / network).
Requires `:location` permission (request via `Mob.Permissions.request/2`).
iOS additionally needs `NSLocationWhenInUseUsageDescription` in
`Info.plist`; Android needs `ACCESS_FINE_LOCATION` and/or
`ACCESS_COARSE_LOCATION` in `AndroidManifest.xml`. See the
[permissions guide](permissions.html) for the cross-platform table
and the "the dialog never appears" failure mode — a missing plist
key or manifest entry is the single most common reason this module
silently does nothing.
Location updates arrive as:
handle_info({:location, %{lat: lat, lon: lon, accuracy: acc, altitude: alt}}, socket)
handle_info({:location, :error, reason}, socket)
Common `reason` atoms:
* `:permission_denied` — user denied `:location` (or revoked it
mid-session via Settings). iOS surfaces this through
`locationManagerDidChangeAuthorization:`; Android via the
permission flow.
* `:unavailable` — the OS can't get a fix right now
(`CLLocationManager.didFailWithError`).
iOS: `CLLocationManager`. Android: `FusedLocationProviderClient`.
"""
@type accuracy :: :high | :balanced | :low
@doc """
Request a single location fix, then stop.
"""
@spec get_once(Mob.Socket.t()) :: Mob.Socket.t()
def get_once(socket) do
:mob_nif.location_get_once()
socket
end
@doc """
Start continuous location updates.
Options:
- `accuracy: :high | :balanced | :low` (default `:balanced`)
Call `stop/1` when done to save battery.
"""
@spec start(Mob.Socket.t(), keyword()) :: Mob.Socket.t()
def start(socket, opts \\ []) do
accuracy = Keyword.get(opts, :accuracy, :balanced)
:mob_nif.location_start(accuracy)
socket
end
@doc """
Stop continuous location updates.
"""
@spec stop(Mob.Socket.t()) :: Mob.Socket.t()
def stop(socket) do
:mob_nif.location_stop()
socket
end
end