插件
地理位置
@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?: boolean | Promise<void> | 请求使用位置服务的权限。在 iOS 上,如果 always 为 true ,则将以下键添加到 Info.plist 中:NSLocationAlwaysAndWhenInUseUsageDescription (iOS 11.0+) 或 NSLocationAlwaysUsageDescription (iOS 8.0-10.0) 和 NSLocationWhenInUseUsageDescription。详细了解 请求始终使用。在 Android SDK >= 29 上,将 always 参数设置为 true 需要将 ACCESS_BACKGROUND_LOCATION 权限添加到 AndroidManifest.xml 中。这会导致用户收到一个系统对话框,其中包含“始终允许”选项。详细了解 Android 位置权限 此处 和 此处。如果 openSettingsIfLocationHasBeenDenied 为 true 且权限先前已被拒绝,则将打开“设置”应用,以便用户可以更改位置服务权限。请参阅 此异常。 |
isEnabled(options?: Options) | Promise<boolean> | 根据位置服务的可用性解析 true 或 false 。 |
distance(loc1: Location, loc2: Location) | number | 计算两个位置之间的距离。返回以米为单位的距离。 |
getIOSLocationManagerStatus() | CLAuthorizationStatus | 返回位置授权权限的状态。 |
Location 类
这是一个数据类,封装了以下地理位置的常用属性。
属性 | 类型 | 描述 |
---|---|---|
latitude | number | 地理位置的纬度,以度为单位。 |
longitude | number | 地理位置的经度,以度为单位。 |
altitude | number | 海拔高度(如果可用),以米为单位。 |
horizontalAccuracy | number | 水平精度,以米为单位。 |
verticalAccuracy | number | 垂直精度,以米为单位。 |
speed | number | 地面速度,以米/秒为单位。 |
timestamp | Date | 确定此位置的时间。 |
Options 接口
以下是传递给插件的地理位置 函数 的 options 对象的属性。
属性 | 类型 | 描述 |
---|---|---|
desiredAccuracy | CoreTypes.Accuracy | 可选:指定是否需要高精度或任何精度。默认为 CoreTypes.Accuracy.high ,它返回可用的最佳位置,但比 CoreTypes.Accuracy.any 选项消耗更多电量。Accuracy.any 被认为大约是 100 米的精度。 |
updateDistance | number | 可选:指定更新位置的频率。以米为单位的更新距离过滤器。在 Apple 文档 和/或 Google 文档 中了解更多信息 |
updateTime | number | 位置更新之间的间隔,以毫秒为单位(在 iOS 上忽略)。在 Google 文档 中了解更多信息。默认为 1 分钟 |
minimumUpdateTime | number | 可选:位置更新之间的最小时间间隔,以毫秒为单位(在 iOS 上忽略)。在 Google 文档 中了解更多信息。 |
maximumAge | number | 可选:位置数据的最大年龄,以 ms 为单位。 |
timeout | number | 可选:它指示等待位置的时间(以 ms 为单位)。默认为 5 分钟 。 |
iosAllowsBackgroundLocationUpdates | boolean | 可选:指示是否允许应用程序在后台接收位置更新(在 Android 上忽略)。默认为 false 。如果启用,则需要 Info.plist 中的 UIBackgroundModes 键。A. 在 Apple 文档 中了解更多信息 |
iosPausesLocationUpdatesAutomatically | boolean | 指示是否允许停用位置更新的自动暂停(在 Android 上忽略)。在 Apple 文档 中了解更多信息 |
已知问题
Android API 30 上的 openSettingsIfLocationHasBeenDenied
如果用户在 Android API 30 上的应用安装期间两次拒绝权限,即使 enableLocationRequest()
的 openSettingsIfLocationHasBeenDenied
选项为 true,用户也不会被带到设置。
许可证
Apache 许可证 2.0 版