【问题标题】:react-native check and prompt user to enable Network/GPSreact-native 检查并提示用户启用网络/GPS
【发布时间】:2017-01-22 20:47:04
【问题描述】:

我正在寻找如何在我的应用程序启动时检查设备上是否启用了网络或 GPS。如果它们被禁用,则提示用户启用它。

这在 React-native 中可行吗?是否有任何类或工具可以帮助处理这种类型的对话框?

【问题讨论】:

    标签: react-native


    【解决方案1】:

    所以我要开始回答我自己的问题了。

    对于 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)
      }
    }
    

    【讨论】:

    • "如果有地理定位请求,IOS 似乎会原生请求" - 它似乎只在第一个请求时发生。在以后的请求中,它们只是从代码中失败并且不显示任何对话提示。在装有 iOS 8 的 iPhone SE 上进行了测试,错误消息是“位置服务已禁用”。
    • 如何提示用户启用网络连接?这只检查状态对吗?
    • @HenningHall 如果你通过 Kanekoti'c [npm package](github.com/webyonet/…) 那么它将带你到 android 设置中的位置部分
    • 有没有办法在没有任何额外模块的情况下出现这个框?
    【解决方案2】:

    为了在 Android 上启用位置/gps,我可以推荐这个模块:https://github.com/Richou/react-native-android-location-enabler

    它使用 标准 Android 对话框 定位:

    【讨论】:

    • 有没有办法在没有任何额外模块的情况下出现这个框?
    • 这项功能适用于 Android 10,因为它没有在许多设备中提供。任何人有任何解决方法???
    • 它抛出一个错误,说 null 不是 react-native 0.62 中的对象
    • @amitpandya 请检查该项目的问题:github.com/Richou/react-native-android-location-enabler/issues
    • 如果没有像新发布的华为设备那样安装 Google Play 服务,您将面临这个库的问题。
    【解决方案3】:

    如果您使用任何类型的包来获取用户的位置,他们很可能会在您第一次请求时自动要求用户启用硬件部分。

    因此,您可以执行以下操作来显示提示:

    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

    【讨论】:

      【解决方案4】:

      在最新版本的 iOS (>= iOS8?) 和 Android 中,您可以显示应用权限对话框并让用户打开/关闭相机和位置等权限。有一个本地模块可以做到这一点:https://github.com/yonahforst/react-native-permissions

      【讨论】:

      • 感谢海涛的解答。但这不是我要找的。这不是关于权限的问题,而是在执行时启用或未启用硬件功能的问题(权限已经存在)。
      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多