位置情報(GPS)
端末の GPS 位置情報にアクセスする
概要
GPS とネットワークを使った現在地の取得をサポートします。Android と iOS で同じ JS API を使用します。
| 機能 | Android | iOS |
|---|---|---|
| 現在地の取得 | ✓(Android 7.0+) | ✓(iOS 13+) |
| 位置変更の検出 | ✓(Android 7.0+) | ✓(iOS 13+) |
対応プラン: Basic 以上
iOS の前提条件
iOS で位置情報機能を使うには、Info.plist に位置情報の使用説明を追加する必要があります。
<key>NSLocationWhenInUseUsageDescription</key>
<string>位置情報に基づくサービスを提供するために位置情報へのアクセスが必要です。</string>App Store 審査を通過するには、使用説明が実際の利用目的と一致している必要があります。バックグラウンドでの位置情報が必要な場合は、NSLocationAlwaysAndWhenInUseUsageDescription も追加してください。
Android の権限について
Android で位置情報機能を使うには、まず AndroidManifest.xml で位置情報の権限のコメントを解除する必要があります。SDK はこれらの権限をデフォルトでコメントアウトした状態で配布するため、実際に使用する権限のみを有効化してください(Google Play データセーフティポリシー)。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />SDK が位置情報の権限をリクエストするとき、Android のバージョンによってユーザーに表示される選択肢が異なります。
| Android バージョン | ユーザーの選択肢 |
|---|---|
| Android 11 以下 | アプリの使用中のみ / 今回のみ / 拒否 |
| Android 12 〜 16 | 正確な位置情報または大まかな位置情報を選択可能 |
| Android 17+ | 「アプリ使用中のみ」正確な位置情報を一時的に付与するオプションが追加 |
ユーザーが**大まかな位置情報(Approximate)**を選択した場合、半径約 3 km の座標が返されます。SDK は正確な位置情報(ACCESS_FINE_LOCATION)をリクエストしますが、ユーザーの選択を強制することはできません。
Android 17 で追加された一時的な正確な位置情報オプションを選択した場合、アプリがバックグラウンドに移った後に位置情報をリクエストすると権限が失効している場合があります。SDK はこのケースを自動で処理します — 権限がない場合は権限リクエストダイアログを再表示し、位置情報の取得に失敗した場合は isSuccess: false でコールバックが呼び出されます。
現在地を取得する
window.unveilyBridge.location.get({
accuracy: "high", // "high" | "medium" | "low"
timeout: 10000, // 最大待機時間(ms)
onResult: "onLocationResult",
onError: "onLocationError"
});
function onLocationResult(result) {
const { latitude, longitude, accuracy } = JSON.parse(result);
console.log(`緯度: ${latitude}, 経度: ${longitude}, 精度: ${accuracy}m`);
}
function onLocationError(error) {
const { code, message } = JSON.parse(error);
if (code === "PERMISSION_DENIED") {
alert("位置情報の権限を許可してください。");
}
}レスポンスの構造
{ "latitude": 37.5665, "longitude": 126.9780, "accuracy": 15.0 }位置変更を検出する(継続受信)
window.unveilyBridge.location.watch({
minDistance: 10, // 最小移動距離(m)以上のときにコールバックを呼ぶ
onUpdate: "onLocationUpdate"
});
function onLocationUpdate(result) {
const { latitude, longitude } = JSON.parse(result);
updateMap(latitude, longitude);
}
// 検出を停止する
window.unveilyBridge.location.stopWatch();エラーコード
| コード | 説明 |
|---|---|
PERMISSION_DENIED | 位置情報の権限がない |
TIMEOUT | 指定した時間内に位置情報を取得できなかった |
UNAVAILABLE | GPS またはネットワーク位置情報が使えない |
サーバー側での位置情報の保存
app.post('/api/location', (req, res) => {
const { latitude, longitude } = req.body;
const userId = req.session.userId;
db.query(
'INSERT INTO user_locations (user_id, latitude, longitude, recorded_at) VALUES (?, ?, ?, NOW())',
[userId, latitude, longitude]
);
res.json({ ok: true });
});[HttpPost("location")]
[Authorize]
public async Task<IActionResult> SaveLocation([FromBody] LocationRequest request)
{
await _locationService.SaveAsync(User.GetUserId(), request.Latitude, request.Longitude);
return Ok(new { ok = true });
}@PostMapping("/api/location")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<?> saveLocation(@RequestBody LocationRequest request,
@AuthenticationPrincipal UserDetails user) {
locationService.save(user.getUsername(), request.getLatitude(), request.getLongitude());
return ResponseEntity.ok(Map.of("ok", true));
}<?php
$data = json_decode(file_get_contents('php://input'), true);
$stmt = $pdo->prepare(
'INSERT INTO user_locations (user_id, latitude, longitude, recorded_at) VALUES (?, ?, ?, NOW())'
);
$stmt->execute([$_SESSION['user_id'], $data['latitude'], $data['longitude']]);
echo json_encode(['ok' => true]);<%
Dim lat, lng
lat = Request.Form("latitude")
lng = Request.Form("longitude")
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open Application("ConnectionString")
conn.Execute "INSERT INTO user_locations (user_id, latitude, longitude) VALUES (" & _
Session("user_id") & ", " & lat & ", " & lng & ")"
Response.ContentType = "application/json"
Response.Write "{""ok"": true}"
%>