SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ExpoとEASで始める快適モバイルアプリ開発

Expoでのパーミッション管理を学び、カメラとGPS機能を活用したアプリを作成しよう

ExpoとEASで始める快適モバイルアプリ開発 第4回

位置情報機能の実装

 スマートフォンのGPS機能を活用することで、ユーザーの現在地に基づいたサービスを提供できます。Expoでは、expo-location モジュールを使用して位置情報機能を実装できます。ここでは、位置情報のパーミッションを取得する必要があります。

expo-locationの基本

 まずは、expo-location モジュールをインストールします(リスト4)。

[リスト4]expo-locationのインストール
$ npx expo install expo-location

 位置情報のパーミッションを取得し、現在位置を表示する基本的な機能を実装します(リスト5)。

[リスト5]app/location.js
import React, { useState, useEffect } from 'react';
import { StyleSheet, Text, View, Alert } from 'react-native';
import * as Location from 'expo-location';

export default function App() {
  // (1) 位置情報関連のstate
  const [locationPermission, setLocationPermission] = useState(null);
  const [location, setLocation] = useState(null);
  const [errorMsg, setErrorMsg] = useState(null);

  // (2) パーミッション要求と位置情報取得
  useEffect(() => {
    (async () => {
      const { status } = await Location.requestForegroundPermissionsAsync();
      setLocationPermission(status === 'granted');
      
      if (status !== 'granted') {
        setErrorMsg('位置情報へのアクセスが拒否されました');
        Alert.alert(
          '位置情報へのアクセスが必要です',
          'このアプリは現在地を表示するために位置情報へのアクセスが必要です。設定からパーミッションを変更してください。',
          [{ text: 'OK' }]
        );
        return;
      }
      
      try {
        // (3) 現在位置を取得
        const currentLocation = await Location.getCurrentPositionAsync({
          accuracy: Location.Accuracy.Balanced,
        });
        setLocation(currentLocation);
      } catch (error) {
        setErrorMsg('位置情報の取得に失敗しました');
        console.error(error);
      }
    })();
  }, []);

  // (4) 表示内容の決定
  let text = '位置情報を取得中...';
  if (errorMsg) {
    text = errorMsg;
  } else if (location) {
    text = `緯度: ${location.coords.latitude}\n経度: ${location.coords.longitude}`;
  }

  // View部分は省略
}

 (1)では、位置情報関連のstateを定義しています。(2)では、パーミッション要求と位置情報取得の処理を行います。

 (3)では、Location.getCurrentPositionAsync() メソッドを使用して現在位置を取得します。(4)では、表示するテキストを決定しています。図3は実際に動かしてみた様子です。

図3:位置情報パーミッションの要求ダイアログ(左:iOS、右:Android)
図3:位置情報パーミッションの要求ダイアログ(左:iOS、右:Android)

 location.coords には、緯度や経度の情報だけではなく、計測精度や高度などの情報も含まれています。取得できる情報については、公式ドキュメントを参照してみてください。

位置情報の監視機能

 位置情報の監視(リアルタイム更新)機能の核となる部分は以下のようになります(リスト6)。

[リスト6]app/location.js
// 位置情報の監視を開始する関数
const startLocationWatch = async () => {
  if (!locationPermission) return;
  
  try {
    // (1) 位置情報の監視を開始
    const subscription = await Location.watchPositionAsync(
      {
        accuracy: Location.Accuracy.Balanced,
        timeInterval: 5000,  // 5秒ごとに更新
        distanceInterval: 10, // (3) 10メートル移動するごとに更新
      },
      (newLocation) => {
        setLocation(newLocation);
        console.log('位置情報が更新されました:', newLocation);
      }
    );
    
    setLocationSubscription(subscription);
  } catch (error) {
    console.error('位置情報の監視に失敗しました:', error);
  }
};

// 監視を停止する関数
const stopLocationWatch = () => {
  if (locationSubscription) {
    locationSubscription.remove(); // (2) 監視を停止
    setLocationSubscription(null);
  }
};

 (1)のように Location.watchPositionAsync()メソッドを使用することで位置情報の監視を開始し、ユーザーが移動するたびに位置情報が更新されます。監視を停止するには、(2)のようにサブスクリプションのremove()メソッドを呼び出します。

 図4は、位置情報の監視機能が実際に動作している様子です。

図4:位置情報の監視機能が実際に動作している様子
図4:位置情報の監視機能が実際に動作している様子

 リスト6の(3)のように distanceInterval を指定することでコールバックを実行する制御しているので、手元で試す場合は、実際に移動して確認してみてください。

まとめ

 今回はExpoを通じてパーミッションが必要なプラットフォーム機能を利用する方法を解説しました。ユーザーの許可を取ることで、よりユーザーが持つコンテキストに応じたアプリを開発できるようになります。こういった機能も適切に扱うことで、よいユーザー体験を提供できるでしょう。

 今回までは、1画面の中でもできることを中心に解説しました。実際のアプリでは、画面を切り替えながら開発を進めていくことになります。次回からは何回かに分けて、画面を切り替えながら開発を進めていく方法を解説します。お楽しみに。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
ExpoとEASで始める快適モバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 中川 幸哉(ナカガワ ユキヤ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21346 2025/04/18 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー