위치 인식 앱 관련 지침

중요 API

이 토픽에서는 사용자의 위치에 액세스해야 하는 앱에 대한 성능 지침을 설명합니다.

권장 사항

  • 앱에 위치 데이터가 필요한 경우에만 위치 개체 사용을 시작하세요.

    사용자의 위치에 액세스하기 전에 RequestAccessAsync를 호출하세요. 이때 앱이 포그라운드에 있어야 하고 RequestAccessAsync가 UI 스레드에서 호출되어야 합니다. 사용자가 자신의 위치에 대한 권한을 앱에 부여하기 전에는 앱이 위치 데이터에 액세스할 수 없습니다.

  • 위치가 앱에 필수적이지 않은 경우, 사용자가 해당 위치를 필요로 하는 작업을 완료하려고 할 때까지는 위치에 액세스하지 마세요. 그 예로 소셜 네트워킹 앱에 "내 위치로 체크인" 기능의 버튼이 있는 경우, 사용자가 이 버튼을 클릭할 때까지는 앱이 위치에 액세스해서는 안 됩니다. 위치가 앱의 기본 함수에 필요하다면 해당 위치에 즉시 액세스해도 됩니다.

  • 사용자에게 동의 프롬프트를 트리거하려면 포그라운드 앱의 기본 UI 스레드에서 Geolocator 개체를 처음으로 사용해야 합니다. Geolocator의 첫 사용은 getGeopositionAsync에 대한 첫 호출 또는 positionChanged 이벤트에 대한 처리기의 첫 등록 중 하나일 수 있습니다.

  • 위치 데이터의 사용 방법을 사용자에게 알립니다.

  • 사용자가 자신의 위치를 수동으로 새로 고칠 수 있도록 UI를 제공합니다.

  • 위치 데이터를 가져오기 위해 대기하는 동안 진행률 표시줄 또는 링을 표시합니다.

  • 위치 서비스를 비활성화했거나 사용할 수 없는 경우 적절한 오류 메시지 또는 대화 상자를 표시합니다.

    위치 설정에서 앱이 사용자의 위치에 액세스하도록 허용되지 않는 경우, 설정 앱의 위치 개인 정보 설정으로 연결되는 간편 링크를 제공하는 것이 좋습니다. 예를 들어 Hyperlink 컨트롤을 사용하거나 LaunchUriAsync 메서드를 호출하면, ms-settings:privacy-location URI를 사용하는 코드에서 설정 앱을 시작할 수 있습니다. 자세한 내용은 Windows 설정 앱 시작하기를 참조하세요.

  • 사용자가 위치 정보에 대한 액세스를 사용하지 않도록 설정하면 캐시된 위치 데이터를 지우고 Geolocator를 해제하세요.

    사용자가 설정을 통해 위치 정보에 대한 액세스를 끄면 Geolocator 개체를 해제하세요. 그런 다음, 앱은 위치 API 호출에 대한 ACCESS_DENIED 결과를 받게 됩니다. 앱이 위치 데이터를 저장하거나 캐시하면 사용자가 위치 정보에 대한 액세스를 취소할 때 캐시된 데이터를 지우세요. 위치 서비스를 통해 위치 데이터를 사용할 수 없는 경우, 위치 정보를 수동으로 입력할 다른 방법을 제시하세요.

  • 위치 서비스 사용을 다시 설정하기 위한 UI를 제공하세요. 예를 들어 Geolocator 개체를 다시 인스턴스화하고 위치 정보를 다시 가져오려고 시도하는 새로 고침 단추를 제공합니다.

    앱이 위치 서비스 사용을 다시 설정하기 위한 UI를 제공하게 하세요.

    • 사용자가 위치 서비스를 사용하지 않도록 설정했다가 사용을 재설정하면 앱에 아무 알림도 뜨지 않습니다. status(상태) 속성은 변경되지 않으며 statusChanged 이벤트도 발생하지 않습니다. 앱으로 업데이트된 위치 데이터를 가져오거나 positionChanged 이벤트를 다시 구독하려면 새 Geolocator 개체를 생성하고 getGeopositionAsync를 호출해야 합니다. 상태가 위치가 다시 활성화되었음을 나타내는 경우, 앱이 이전에 위치 서비스를 사용하지 않도록 설정한 것을 사용자에게 알린 대로 UI를 지우고, 새 상태에 적절하게 응답하세요.
    • 이외에도 앱은 활성화 시 또는 사용자가 위치 정보가 필요한 기능을 명시적으로 사용하려고 할 때, 혹은 다른 시나리오에 적합한 시간에 위치 데이터를 가져오려고 다시 시도해야 합니다.

성능

  • 앱이 위치 업데이트를 받을 필요가 없는 경우 일회성 위치 요청을 사용하세요. 그 예로 사진에 위치 태그를 추가하는 앱은 위치 업데이트 이벤트를 받을 필요가 없습니다. 그 대신 현재 위치 가져오기에 설명된 대로 getGeopositionAsync를 사용해서 위치를 요청해야 합니다.

    일회성 위치 요청을 할 때는 다음 값을 설정해야 합니다.

    • DesiredAccuracy 또는 DesiredAccuracyInMeters를 설정해서 앱에서 요청한 정확도를 지정하세요. 이 매개변수들의 사용에 대한 권장 사항은 아래 내용을 참조하세요.
    • 앱에 유용한 위치를 가져올 수 있는 기간을 지정하려면 GetGeopositionAsync의 최대 기간 매개변수를 설정하세요. 앱으로 몇 초 또는 몇 분 전의 위치를 사용할 수 있는 경우, 해당 앱은 거의 즉시 위치를 수신하고 디바이스 전원을 절약하는 데 기여할 수 있습니다.
    • GetGeopositionAsync의 시간 제한 매개변수를 설정하세요. 이 항목은 앱이 위치 또는 오류가 반환될 때까지 대기할 수 있는 기간입니다. 사용자에 대한 응답성과 앱에 필요한 정확도 간의 균형을 파악해야 합니다.
  • 위치 업데이트가 자주 필요한 경우에는 연속 위치 세션을 사용하세요. 특정 임곗값을 초과하는 이동을 감지하거나 이벤트 발생 시의 연속 위치 업데이트를 위해 positionChanged 이벤트 및 statusChanged 이벤트를 사용하세요.

    위치 업데이트를 요청하는 경우, DesiredAccuracy 또는 DesiredAccuracyInMeters를 설정하면 앱에서 요청한 정확도를 지정할 수 있습니다. 또한 MovementThreshold 또는 ReportInterval을 사용해서 위치 업데이트가 필요한 빈도를 설정해야 합니다.

    • 이동 임곗값을 지정하세요. 일부 앱에서는 사용자가 장거리를 이동한 경우에만 위치 업데이트가 필요합니다. 그 예로 현지 뉴스 또는 날씨 업데이트를 제공하는 앱에는 사용자의 위치가 다른 도시로 변경되지 않는 한 위치 업데이트가 필요하지 않을 수 있습니다. 이 경우에는 MovementThreshold 속성을 설정해서 위치 업데이트 이벤트에 필요한 최소 이동을 조정해야 합니다. 이렇게 하면 PositionChanged 이벤트를 필터링하는 효과가 있습니다. 이 이벤트는 위치 변화가 이동 임곗값을 초과하는 경우에만 발생합니다.

    • 앱 환경에 맞게 조정되고 시스템 리소스 사용을 최소화하는 reportInterval을 사용하세요. 그 예로 날씨 앱은 15분에 한 번씩만 데이터 업데이트가 필요할 수 있습니다. 실시간 탐색 앱을 제외한 대부분의 앱에는 매우 정확하고 일정한 위치 업데이트 스트림이 필요하지 않습니다. 앱에 가능한 한 가장 정확한 데이터 스트림이 필요하지 않거나 업데이트가 드물게 필요한 경우, 앱에 필요한 위치 업데이트의 최소 빈도가 표시되도록 ReportInterval 속성을 설정하세요. 그러고 나면 위치 원본이 필요한 경우에만 위치를 계산하여 전원을 절약할 수 있습니다.

      실시간 데이터가 필요한 앱에서는 최소 간격이 지정되지 않았음을 나타내기 위해 ReportInterval을 0으로 설정해야 합니다. 기본 보고서 간격은 1초 또는 하드웨어에서 최대한 지원할 수 있는 빈도(둘 중 더 짧은 기간)입니다.

      위치 데이터를 제공하는 디바이스는 다른 앱에서 요청한 보고서 간격을 추적하고, 요청된 최소 간격으로 데이터 보고서를 제공할 수 있습니다. 이 때문에 정확도가 가장 필요한 앱이 필요한 데이터를 받습니다. 따라서 다른 앱이 업데이트를 더 자주 요청했다면, 위치 공급자가 앱이 요청한 것보다 높은 빈도로 업데이트를 생성할 수 있습니다.

      참고 위치 원본이 지정된 보고서 간격에 대한 요청을 반드시 이행하는 것은 아닙니다. 일부 위치 공급자 디바이스가 보고서 간격을 추적하지 않는 경우도 있지만, 이 경우에도 추적을 수행하는 디바이스에게 보고서 간격을 제공해야 합니다.

    • 전력을 절약하려면 앱에 정확도가 높은 데이터가 필요한지 여부를 위치 플랫폼에 표시하기 위해 desiredAccuracy 속성을 설정하세요. 정확도가 높은 데이터가 필요한 앱이 없다면 GPS 공급자를 켜지 않음으로써 시스템의 전력을 절약할 수 있습니다.

      • GPS가 데이터를 획득할 수 있도록 desiredAccuracyHIGH(높음)로 설정하세요.
      • desiredAccuracyDefault(기본값)로 설정하고, 앱이 광고 대상 지정 시에만 위치 정보를 사용할 경우 단일 샷 호출 패턴만 사용해서 전력 사용량을 최소화하세요.

      앱에 정확도에 관한 특정 요건이 있는 경우에는 DesiredAccuracy를 사용하는 대신 DesiredAccuracyInMeters 속성을 사용해야 합니다. 이는 일반적으로 셀룰러 비콘, Wi-Fi 비콘 및 위성을 기준으로 위치를 얻을 수 있는 Windows Phone에 특히 유용합니다. 보다 구체적인 정확도 값을 선택하면 시스템이 위치 제공 시 가장 낮은 전력 비용으로 사용할 적합한 기술을 파악할 수 있습니다.

      예시:

      • 앱이 광고 튜닝, 날씨, 뉴스 등을 위해 위치를 가져올 경우, 대개 정확도가 5,000m이면 충분합니다.
      • 앱이 이웃의 인근 거래를 표시하고 있는 경우 일반적으로 300미터 정확성이 결과를 제공하는 데 적합합니다.
      • 사용자가 인근 식당에 대한 권장 사항을 찾고 있다면 한 블록 내에서 위치를 찾아야 할 가능성이 높으므로, 정확도가 100m이면 충분합니다.
      • 사용자가 자신의 위치를 공유하려 한다면 앱에서 정확도를 약 10m로 요청해야 합니다.
    • 앱에 특수한 정확도 요건이 있다면 Geocoordinate.accuracy 속성을 사용하세요. 그 예로 탐색 앱은 Geocoordinate.accuracy 속성을 사용해서 사용 가능한 위치 데이터가 앱의 요건을 충족하는지 여부를 확인해야 합니다.

  • 시작 지연을 고려하세요. 앱이 위치 데이터를 처음 요청할 때, 위치 공급자가 시작되는 동안 짧은 지연(1~2초)이 발생할 수 있습니다. 앱의 UI를 설계할 때 이 점을 감안하세요. 그 예로 GetGeopositionAsync에 대한 호출이 완료될 때까지 대기하면서 다른 작업이 차단되는 것을 방지할 수 있습니다.

  • 백그라운드 동작을 고려하세요. 앱에 포커스가 없는 경우, 백그라운드에서 일시 중단된 동안에는 앱이 위치 업데이트 이벤트를 수신하지 않습니다. 앱이 해당 이벤트를 로깅하여 위치 업데이트를 추적한다면 이 점에 유의하세요. 앱이 포커스를 되찾으면 새 이벤트만 수신합니다. 앱이 비활성 상태일 때 발생한 업데이트는 어떤 것도 받을 수 없습니다.

  • 원시 센서 및 퓨전 센서를 효율적으로 사용하세요. 센서는 두 가지 유형, 즉 원시 센서와 퓨전 센서가 있습니다.

    • 원시 센서로는 가속도계, 회전계, 자력계 등이 있습니다.
    • 퓨전 센서로는 방향계, 경사계, 나침반 등이 있습니다. 퓨전 센서는 원시 센서의 조합에서 데이터를 가져옵니다.

    Windows 런타임 API는 자력계를 제외한 이 모든 센서에 액세스할 수 있습니다. 퓨전 센서는 원시 센서보다 정확하고 안정적이지만 더 많은 전력을 사용합니다. 올바른 목적에 적합한 센서를 사용해야 합니다. 자세한 내용은 센서를 참조하세요.

연결된 대기 상태

  • PC가 대기 상태로 연결되어 있는 경우에는 Geolocator 개체를 항상 인스턴스화할 수 있습니다. 그러나 Geolocator 개체가 집계할 센서를 찾지 못하면 GetGeopositionAsync에 대한 호출이 7초 후에 시간 초과되고, PositionChanged 이벤트 수신기가 전혀 호출되지 않으며, StatusChanged 이벤트 수신기가 NoData 상태로 한 번 호출됩니다.

추가 사용법 지침

위치 설정의 변경 감지하기

사용자는 설정 앱의 위치 개인 정보 설정을 사용해서 위치 기능을 끌 수 있습니다.

  • 사용자가 위치 서비스를 사용하지 않도록 설정하거나 다시 사용하도록 설정하는 시기를 감지하려면 다음 방법대로 하세요.
    • StatusChanged 이벤트를 처리하세요. StatusChanged 이벤트에 대한 인수의 Status(상태) 속성은 사용자가 위치 서비스를 끄면 Disabled(사용 안 함) 값으로 설정됩니다.
    • GetGeopositionAsync에서 반환된 오류 코드를 확인하세요. 사용자가 위치 서비스를 사용하지 않도록 설정한 경우 ACCESS_DENIED 오류로 인해 GetGeopositionAsync 호출이 실패하고 LocationStatus 속성은 Disabled 값을 가집니다.
  • 위치 데이터가 필수적인 앱(예: 매핑 앱)이 있다면 다음 작업을 반드시 수행하세요.
    • 사용자의 위치가 변경되면 PositionChanged 이벤트를 처리하여 업데이트를 받으세요.
    • 위치 설정의 변경 사항을 찾으려면 이전에 설명한 대로 StatusChanged 이벤트를 처리하세요.

위치 서비스는 사용이 가능해지면 데이터를 반환합니다. 먼저 오류 반경이 더 큰 위치를 반환한 다음, 위치 서비스 사용이 가능해지면 더 정확한 정보로 위치를 업데이트할 수 있습니다. 사용자의 위치를 표시하는 앱은 일반적으로 더 정확한 정보를 사용할 수 있게 되면 위치를 업데이트하려고 합니다.

위치의 그래픽 표현

사용자의 현재 위치를 지도에 명확하게 표시하려면 앱에서 Geocoordinate.accuracy를 사용하세요. 정확도의 기본 대역은 세 가지, 즉 약 10m의 오류 반경, 약 100m의 오류 반경, 1km보다 큰 오류 반경이 있습니다. 정확도 정보를 사용하면 앱이 사용 가능한 데이터의 맥락에서 위치를 정확하게 표시하게 할 수 있습니다. 지도 컨트롤 사용 방법에 대한 전체 내용은 2D 뷰, 3D 뷰 및 거리 뷰가 있는 지도 표시하기를 참조하세요.

  • 정확도가 약 10m(GPS 해상도)인 경우에는 지도에 점이나 핀으로 위치를 표시할 수 있습니다. 이 정확도를 사용하면 위도-경도 좌표와 거리 주소도 표시할 수 있습니다.

    약 10미터의 gps 정확도로 표시된 지도의 예입니다.

  • 정확도가 10~500m 사이(약 100m)인 경우, 위치는 일반적으로 Wi-Fi 해상도를 통해 수신됩니다. 셀룰러에서 얻은 위치의 정확도는 약 300m입니다. 이 경우에는 앱에 오류 반경을 표시하는 것이 좋습니다. 가운데 점이 필요한 방향을 표시하는 앱에서는 이 점을 그 주변의 오류 반경과 함께 표시할 수 있습니다.

    약 100미터의 Wi-Fi 정확도로 표시된 지도의 예입니다.

  • 반환된 정확도가 1km보다 크면 IP 수준 해상도에서 위치 정보를 수신할 수 있습니다. 이 정확도 수준은 너무 낮아서 지도상의 특정 지점을 정확히 파악할 수 없는 경우가 많습니다. 앱은 지도의 도시 수준까지 확대하거나 오류 반경(예: 지역 수준)에 따라 적절한 영역까지 확대해야 합니다.

    약 1킬로미터의 Wi-Fi 정확도로 표시된 지도의 예입니다.

위치 정확도가 한 정확도 대역에서 다른 정확도 대역으로 전환되면 다양한 그래픽 표현이 서로 원활하게 전환됩니다. 이 작업은 다음을 통해 수행할 수 있습니다.

  • 전환 애니메이션을 매끄럽게 만들어서 이 전환을 빠르고 유연하게 유지하세요.
  • 예상을 벗어나고 지나치게 빈번한 확대/축소를 방지할 수 있도록 몇 개의 연속 보고서에서 정확도 변경이 확인될 때까지 기다리세요.

위치의 텍스트 표현

일부 유형의 앱(예: 날씨 앱 또는 현지 컬 정보 앱)에는 다양한 정확도 대역에서 텍스트로 위치를 나타내는 방법이 필요합니다. 위치는 데이터에 제공된 정확도 수준까지만 명확하게 표시해야 합니다.

  • 정확도가 약 10m(GPS 해상도)인 경우에는 수신된 위치 데이터가 매우 정확하므로 이웃 이름 수준까지 전달될 수 있습니다. 도시 이름, 시/도 이름 및 국가/지역 이름도 사용할 수 있습니다.
  • 정확도가 약 100m(Wi-Fi 해상도)인 경우에는 수신된 위치 데이터가 적당히 정확하므로, 도시 이름까지 정보를 표시하는 것이 좋습니다. 이웃 이름을 사용하지 마세요.
  • 정확도가 1km(IP 해상도)보다 큰 경우 시/도 이름 또는 국가/지역 이름만 표시하세요.

개인정보처리방침 고려 사항

사용자의 지리적 위치는 PII(개인 식별 정보)입니다. 다음 웹사이트에서는 사용자 개인 정보를 보호하기 위한 지침을 제공합니다.