8.7 版本发布—WinterCG 兼容性第一部分
了解更多

在 GitHub 上查看

@nativescript/geolocation

内容

简介

一个用于获取当前位置、监控移动等地理位置插件。

安装

要安装该插件,请在项目根目录下运行以下命令。

cli
npm install @nativescript/geolocation

Android 权限要求

要在 Android 上使用地理位置,您需要将以下权限添加到应用程序的 AndroidManifest.xml 中,该文件位于 App_Resources/Android/src/main 目录下

xml
<!-- Always include this permission -->
  <!-- This permission is for "approximate" location data -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <!-- This permission is for "precise" location data -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

更多信息可以在 此处找到 Android 文档

iOS 权限要求

如果 options 对象的 iosAllowsBackgroundLocationUpdates 属性设置为 true,则需要在 App_Resources/iOS/Info.plist 文件中添加以下代码

xml
<key>UIBackgroundModes</key>
<array>
  <string>location</string>
</array>

使用 @nativescript/geolocation

获取当前位置

在调用任何获取用户位置的方法之前,请通过调用 enableLocationRequest 方法请求用户的权限。一旦用户授予权限,您就可以调用 getCurrentLocation() 方法并传递一个 options 对象来获取用户当前的位置。

ts
import * as geolocation from '@nativescript/geolocation'
import { CoreTypes } from '@nativescript/core' // used to describe at what accuracy the location should get

geolocation.enableLocationRequest().then(() => {
  geolocation
    .getCurrentLocation({
      desiredAccuracy: CoreTypes.Accuracy.high,
      maximumAge: 5000,
      timeout: 20000,
    })
    .then((currentLocation) => {
      console.log('My current latitude: ', currentLocation.latitude)
    })
})

API

插件函数

该插件提供了以下函数来获取当前位置等信息

方法返回值描述
getCurrentLocation(options: Options)Promise<Location>获取当前位置并应用指定的选项(如果有)。从插件的 5.0 版本开始,它将使用 requestLocation API 用于使用 iOS 9.0+ 的设备。在 GPS 信号弱或没有 GPS 信号但有可用 Wi-Fi 的情况下,它将花费 10 秒才能返回位置。
options 参数是可选的。
watchLocation(successCallback: successCallbackType, errorCallback: errorCallbackType, options?: Options)number监控位置变化。
watchPermissionStatus(permissionCallback: permissionCallbackType, errorCallback: errorCallbackType)number(仅限 iOS)监控位置权限的变化。
clearWatch(watchId: number)void停止监控位置变化。watchId 参数由 watchLocation() 方法返回。
enableLocationRequest(always?: boolean, openSettingsIfLocationHasBeenDenied?: booleanPromise<void>请求使用位置服务的权限。在 iOS 上,如果 alwaystrue,则将以下键添加到 Info.plist 中:NSLocationAlwaysAndWhenInUseUsageDescription (iOS 11.0+) 或 NSLocationAlwaysUsageDescription (iOS 8.0-10.0) 和 NSLocationWhenInUseUsageDescription。详细了解 请求始终使用。在 Android SDK >= 29 上,将 always 参数设置为 true 需要将 ACCESS_BACKGROUND_LOCATION 权限添加到 AndroidManifest.xml 中。这会导致用户收到一个系统对话框,其中包含“始终允许”选项。详细了解 Android 位置权限 此处此处。如果 openSettingsIfLocationHasBeenDeniedtrue 且权限先前已被拒绝,则将打开“设置”应用,以便用户可以更改位置服务权限。请参阅 此异常
isEnabled(options?: Options)Promise<boolean>根据位置服务的可用性解析 truefalse
distance(loc1: Location, loc2: Location)number计算两个位置之间的距离。返回以米为单位的距离。
getIOSLocationManagerStatus()CLAuthorizationStatus返回位置授权权限的状态。

Location 类

这是一个数据类,封装了以下地理位置的常用属性。

属性类型描述
latitudenumber地理位置的纬度,以度为单位。
longitudenumber地理位置的经度,以度为单位。
altitudenumber海拔高度(如果可用),以米为单位。
horizontalAccuracynumber水平精度,以米为单位。
verticalAccuracynumber垂直精度,以米为单位。
speednumber地面速度,以米/秒为单位。
timestampDate确定此位置的时间。

Options 接口

以下是传递给插件的地理位置 函数 的 options 对象的属性。

属性类型描述
desiredAccuracyCoreTypes.Accuracy可选:指定是否需要高精度或任何精度。默认为 CoreTypes.Accuracy.high,它返回可用的最佳位置,但比 CoreTypes.Accuracy.any 选项消耗更多电量。Accuracy.any 被认为大约是 100 米的精度。
updateDistancenumber可选:指定更新位置的频率。以米为单位的更新距离过滤器。在 Apple 文档 和/或 Google 文档 中了解更多信息
updateTimenumber位置更新之间的间隔,以毫秒为单位(在 iOS 上忽略)。在 Google 文档 中了解更多信息。默认为 1 分钟
minimumUpdateTimenumber可选:位置更新之间的最小时间间隔,以毫秒为单位(在 iOS 上忽略)。在 Google 文档 中了解更多信息。
maximumAgenumber可选:位置数据的最大年龄,以 ms 为单位。
timeoutnumber可选:它指示等待位置的时间(以 ms 为单位)。默认为 5 分钟
iosAllowsBackgroundLocationUpdatesboolean可选:指示是否允许应用程序在后台接收位置更新(在 Android 上忽略)。默认为 false。如果启用,则需要 Info.plist 中的 UIBackgroundModes 键。A. 在 Apple 文档 中了解更多信息
iosPausesLocationUpdatesAutomaticallyboolean指示是否允许停用位置更新的自动暂停(在 Android 上忽略)。在 Apple 文档 中了解更多信息

已知问题

Android API 30 上的 openSettingsIfLocationHasBeenDenied

如果用户在 Android API 30 上的应用安装期间两次拒绝权限,即使 enableLocationRequest()openSettingsIfLocationHasBeenDenied 选项为 true,用户也不会被带到设置。

许可证

Apache 许可证 2.0 版

上一页
Flutter