Unity iOS/Android를 사용하여 위치 정보 얻기

15502 단어 위치 정보Unity
Unity에 기록된 iOS/Android에서 위치 정보와 iOS/Android 권한 주위에 대한 시도를 얻을 수 있습니다.

Unity 공식 위치 정보 가져오기 예제 코드


Unity 공식 위치 정보 가져오기 예제 코드의 평론 번역은 다음과 같다.
이 코드도 위치 정보를 얻을 수 있지만 유니티의 위치 정보를 관리하는 취득 클래스LocationService는 너무 간단하다. iOS/Android의 위치 정보 취득 가능 상태에 따라 어떤 행동을 하는지 문서에서 알 수 없다. 본 보도는 모바일 컴퓨터에서 그 부근을 확인한다.
using UnityEngine;
using System.Collections;

public class TestLocationService : MonoBehaviour
{
    IEnumerator Start()
    {
        // 最初に、ユーザーがロケーションサービスを有効にしているかを確認する。無効の場合は終了する
        if (!Input.location.isEnabledByUser)
            yield break;

        // 位置を取得する前にロケーションサービスを開始する
        Input.location.Start();

        // 初期化が終了するまで待つ
        int maxWait = 20; // タイムアウトは20秒
        while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
        {
            yield return new WaitForSeconds(1); // 1秒待つ
            maxWait--;
        }

        // サービスの開始がタイムアウトしたら(20秒以内に起動しなかったら)、終了
        if (maxWait < 1)
        {
            print("Timed out");
            yield break;
        }

        // サービスの開始に失敗したら終了
        if (Input.location.status == LocationServiceStatus.Failed)
        {
            print("Unable to determine device location");
            yield break;
        }
        else
        {
            // アクセスの許可と位置情報の取得に成功
            print("Location: " + Input.location.lastData.latitude + " "
                               + Input.location.lastData.longitude + " "
                               + Input.location.lastData.altitude + " "
                               + Input.location.lastData.horizontalAccuracy + " "
                               + Input.location.lastData.timestamp);
        }

        // 位置の更新を継続的に取得する必要がない場合はサービスを停止する
        Input.location.Stop();
    }
}

작업 환경

  • Unity 2018.4f8Mac Edition
  • XCode 11.0
  • 각 OS의 위치 정보에 대한 라이센스 상태


    iOS 및 Android에 대한 각 OS의 위치 정보에 대한 라이센스 상태는 아래에 나와 있습니다.
    유니티에서 이 일대는 추상적이다.

    iOS


    LocationService에서 말한 바와 같이 다음과 같은 5가지 상태가 존재한다.
  • notDetermined - 선택되지 않은 사용자
  • restricted - 무단(사용자가 특별히 거부하지 않았지만 어떤 이유로 사용할 수 없는 경우)
  • denied-사용자 거부
  • authorizedAlways- 항상 허용
  • 응용 프로그램을 사용할 때만 authorizedWhenInUser-
  • notDetermined


    사용자는 응용 프로그램이 위치 정보 서비스를 사용할 수 있는지 선택하지 않았습니다.
    이 상태는 위치 정보 확인 대화 상자가 표시되지 않았습니다.
    iOS13.2.1의 위치 정보 확인 대화 상자
    CLAuthorizationStatus

    restricted


    응용 프로그램에서 위치 정보 서비스를 사용할 수 없습니다.
    사용자는 특별히 위치 정보 서비스 사용을 거부하지 않았지만, 어떤 이유로 사용할 수 없을 때는 반드시 이 상태에 있어야 한다.
    "설정 > 프라이버시 > 위치 정보 서비스"에서 위치 정보 서비스를 닫은 경우 이 상태(iOS13.1.2를 통해 확인).

    denied


    사용자가 응용 프로그램의 위치 정보 서비스 사용을 거부하거나 설정에서 전역적으로 비활성화됩니다.
    위치 정보 확인 대화 상자에서 거부 또는 [설정 > 프라이버시 > 위치 정보 서비스] 에서 [없음] 이 상태를 선택합니다.

    authorizedAlways


    사용자는 응용 프로그램이 언제든지 위치 정보 서비스를 시작할 수 있도록 허용한다.
    위치 정보의 확인 대화 상자에서 [항상]을 선택하면 상태가 됩니다.응용 프로그램이 백그라운드에 있어도 응용 프로그램은 위치 정보를 얻을 수 있다.

    authorizedWhenInUse


    사용자 승인 응용 프로그램은 사용 중에 위치 정보 서비스를 시작합니다.
    위치 정보의 확인 대화 상자에서 "사용 중만"을 선택하면 이 상태가 됩니다.응용 프로그램이 프론트 데스크톱인 상태에서만 응용 프로그램이 위치 정보를 얻을 수 있다.

    Android


    다음 세 가지 상태가 있습니다.
  • 선택되지 않음, 1회만 거부
  • 승인됨
  • 거부
  • 선택되지 않음, 한 번만 거부


    사용자는 응용 프로그램에서 위치 정보를 사용할 수 있는지 선택하지 않았습니다.
    또는 응용 프로그램에서 위치 정보를 사용할 수 없습니다.
    이 상태는 위치 정보 확인 대화 상자가 표시되지 않았습니다.
    또는 위치 정보에 대한 확인 대화 상자에서 거부된 상태를 선택합니다.
  • Android에서 이 상태에서 를 호출하면 PermissionChecker.checkSelfPermission (라이센스 없음) 반환됩니다.
  • Android에서 이 상태PackageManager.PERMISSION_DENIED에서 위치 정보에 대한 확인 대화 상자를 표시합니다.
  • Android9에서 위치 정보 확인 대화 상자
    Activity.requestPermissions

    허락


    사용자는 응용 프로그램에서 위치 정보 서비스를 사용할 수 있습니다.
    위치 정보에 대한 확인 대화 상자에서 라이센스가 선택된 상태입니다.
  • Android에서 이 상태에서 를 호출하면 PermissionChecker.checkSelfPermission (라이센스됨) 로 돌아갑니다.
  • 거부하다


    응용 프로그램에서 위치 정보를 사용할 수 없습니다.
    위치 정보에 대한 확인 대화 상자에서 향후 표시되지 않음을 선택한 상태입니다.
  • Android에서 이 상태에서 PackageManager.PERMISSION_GRANTED 를 호출하면 PermissionChecker.checkSelfPermission (라이센스 없음) 반환됩니다.
  • Android에서 이 상태에서 PackageManager.PERMISSION_DENIED 를 호출하면 Activity.requestPermissions 로 즉시 리셋됩니다.
  • Android9의 위치 정보 확인 대화 상자에 표시되지 않음 확인
    Activity. onRequestPermissionsResult

    위치 정보를 얻을 수 있는 모든 동작 정보


    LocationService.isEnabledByUser



    사용자가 위치 정보 서비스를 사용할지 여부입니다.

    iOS


    '설정 > 프라이버시 > 위치 정보 서비스'에서 위치 정보 서비스를 닫을 때 가짜로 돌아갑니다.
    위치 정보 허용 여부와 무관합니다.
    상태
    LocationService.isEnabledbyUser의 반환 값
    notDetermined
    true
    restricted
    false
    denied
    true
    authorizedAlways
    true
    authorizedWhenInUse
    true

    Android


    상태
    LocationService.isEnabledbyUser의 반환 값
    선택되지 않음, 한 번만 거부
    false
    허락
    true
    거부하다
    false

    LocationService.Start


    LocationService.isEnabledByUser
    위치 정보 서비스의 업데이트를 시작합니다.
    호출 LocationService.StartLocationService.StartLocationService.status 이면 LocationServiceStatus.Running 에서 위치 정보를 얻을 수 있습니다.

    iOS


    상태
    LocationService.호출된 비헤이비어 시작
    notDetermined
    위치 정보의 확인 대화 상자를 표시합니다.
    restricted
    위치 정보를 사용할 수 있도록 위치 정보 서비스를 엽니다.LocationService.status는 Failed입니다.
    denied
    LocationService.status는 Failed입니다.
    authorizedAlways
    LocationService.status는 Running입니다.
    authorizedWhenInUse
    LocationService.status는 Running입니다.
    위치 정보의 확인 대화 상자에서 라이센스를 선택한 경우 LocationService.statusRunning 입니다.
    위치 정보 서비스 열기 대화 상자
    LocationService.lastData

    Android


    상태
    LocationService.호출된 비헤이비어 시작
    선택되지 않음, 한 번만 거부
    위치 정보의 확인 대화 상자를 표시합니다.LocationService.status는 Stopped, 허가를 선택할 때 LocationService.isEnabledByUser 진실로 유지됩니다.
    허락
    LocationService.status는 Running입니다.
    거부하다
    LocationService.status는 Stopped입니다.
    위치 정보의 확인 대화 상자에서 라이센스를 선택하더라도 LocationService.isEnabledByUser 실제 상태는 변경되지 않습니다.
    위치 정보를 얻은 경우 다시 호출해야 합니다LocationService.status.

    LocationService.Stop



    위치 정보 서비스의 업데이트를 중지합니다.

    iOS/Android

    LocationService.StartLocationService.status입니다.Stopped의 값이 더 이상 업데이트되지 않습니다.

    총결산

  • iOS는 LocationService.lastData만 봐도 "설정 > 프라이버시 > 위치 정보 서비스"가 켜져 있는지 꺼져 있는지 알 수 있습니다
  • iOS는 응용 프로그램의 위치 정보를 얻을 수 있는지 미리 알 수 없습니다.호출LocationService.isEnabledByUser의 행동으로만 판정할 수 있다.
  • iOS 응용 프로그램은 위치 정보를 얻을 수 있는 대화상자를 표시할지 미리 알지 못합니다.호출LocationService.Start 시 OS에 위치 정보를 얻을 수 있는 대화 상자가 표시됩니다.
  • LocationService.Start를 보면 안드로이드가 응용 프로그램의 위치 정보를 얻을 수 있는지 알 수 있다
  • Android 응용 프로그램은 위치 정보가 허가를 받지 않은 경우LocationService.isEnabledByUserfalse인 경우), 위치 정보 허가 대화상자를 표시할지 여부를 미리 알 수 없습니다.호출LocationService.isEnabledByUser 시 OS에 위치 정보를 얻을 수 있는 대화 상자가 표시됩니다.
  • iOS와 안드로이드를 동시에 대응하여 위치 정보를 얻으려면 호출LocationService.Start을 바탕으로 LocationService.Start의 값이 어떻게 되는지 감시할 수 밖에 없다.

    코드


    참고 자료

  • LocationService.Stop
  • Unity - Scripting API: LocationService
  • CLAuthorizationStatus - Core Location | Apple Developer Documentation
  • ActivityCompat  |  Android Developers
  • PermissionChecker  |  Android Developers
  • 좋은 웹페이지 즐겨찾기