【发布时间】:2017-01-22 20:47:04
【问题描述】:
我正在寻找如何在我的应用程序启动时检查设备上是否启用了网络或 GPS。如果它们被禁用,则提示用户启用它。
这在 React-native 中可行吗?是否有任何类或工具可以帮助处理这种类型的对话框?
【问题讨论】:
标签: react-native
我正在寻找如何在我的应用程序启动时检查设备上是否启用了网络或 GPS。如果它们被禁用,则提示用户启用它。
这在 React-native 中可行吗?是否有任何类或工具可以帮助处理这种类型的对话框?
【问题讨论】:
标签: react-native
所以我要开始回答我自己的问题了。
对于 GPS:
似乎有一个明智的解决方案。如果有地理定位请求,IOS 似乎会原生请求。对于 Android,这不是本机支持的,但有人为此创建了一个模块 (https://github.com/webyonet/react-native-android-location-services-dialog-box)
所以在我的动作创建器中我添加了下一个代码:
if(Platform.OS === 'android')
LocationServicesDialogBox.checkLocationServicesIsEnabled({
message: "<h2>Use Location?</h2> \
This app wants to change your device settings:<br/><br/>\
Use GPS for location<br/><br/>",
ok: "YES",
cancel: "NO"
}).then(() => {
locationTracking(dispatch, getState, geolocationSettings)
})
对于网络: 两者都没有本机支持,所以我最终做我自己的动作创建者来检查。
export function networkCheck(){
return (dispatch) => {
const dispatchNetworkState = (isConnected) => dispatch({
type: types.NETWORK_STATE,
state: isConnected
})
const handle = () => NetInfo.isConnected.fetch().done(dispatchNetworkState)
NetInfo.isConnected.addEventListener('change', handle);
}
}
一点额外的:
对于 GPS,我添加了这个来检查用户是否在任务中途关闭并禁用 GPS。
export function locationCheck(geolocationSettings = {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000, distanceFilter:10}){
return (dispatch) => {
navigator.geolocation.watchPosition(
() => {
dispatch({
type: types.LOCATION_STATE,
state: true
})
},
() => {
dispatch({
type: types.LOCATION_STATE,
state: false
})
},
geolocationSettings)
}
}
【讨论】:
为了在 Android 上启用位置/gps,我可以推荐这个模块:https://github.com/Richou/react-native-android-location-enabler
【讨论】:
如果您使用任何类型的包来获取用户的位置,他们很可能会在您第一次请求时自动要求用户启用硬件部分。
因此,您可以执行以下操作来显示提示:
CheckForGPSEnablement() {
return new Promise(resolve => {
RNLocation.configure({
distanceFilter: 100, // Meters
desiredAccuracy: {
ios: "best",
android: "balancedPowerAccuracy",
},
// Android only
androidProvider: "auto",
interval: 5000, // Milliseconds
fastestInterval: 10000, // Milliseconds
maxWaitTime: 5000, // Milliseconds
// iOS Only
activityType: "other",
allowsBackgroundLocationUpdates: false,
headingFilter: 1, // Degrees
headingOrientation: "portrait",
pausesLocationUpdatesAutomatically: false,
showsBackgroundLocationIndicator: false,
})
.then(x => {
console.log({ x })
resolve(true)
})
.catch(err => {
console.log({ err })
resolve(false)
})
})
}
就我而言,我使用了react-native-location。
【讨论】:
在最新版本的 iOS (>= iOS8?) 和 Android 中,您可以显示应用权限对话框并让用户打开/关闭相机和位置等权限。有一个本地模块可以做到这一点:https://github.com/yonahforst/react-native-permissions
【讨论】: