【问题标题】:Can you track background geolocation with React Native?你可以使用 React Native 跟踪背景地理定位吗?
【发布时间】:2019-07-15 15:44:45
【问题描述】:

问题

我希望即使应用不再在前台也能跟踪用户的位置(例如,用户已切换到另一个应用或切换到主屏幕并锁定了他们的手机)。

用例是跟踪跑步的用户。他们可以打开应用程序并在开始运行时按“开始”,然后切换或最小化应用程序(按主页按钮)并锁定屏幕。在跑步结束时,他们可以将应用程序带到前台并按“停止”,应用程序会告诉他们在跑步过程中行驶的距离。

问题

是否可以在 iOS 和 Android 上使用纯 react native 跟踪后台地理定位?

有关地理位置的 react 原生文档 (https://facebook.github.io/react-native/docs/geolocation) 不是很清楚或详细。上面的文档链接避开了 iOS 上的背景地理定位(没有完全清楚),但没有提到 Android。

我最好使用 Expo 吗?

【问题讨论】:

    标签: javascript android reactjs react-native geolocation


    【解决方案1】:

    可以,但不使用 Expo,我见过两个模块:

    这是商业版,需要购买授权https://github.com/transistorsoft/react-native-background-geolocation

    还有这个https://github.com/mauron85/react-native-background-geolocation

    【讨论】:

    • 我看过这两个模块。我担心第二个的稳定性,不确定我是否应该这样做?此外,世博会现在表示他们支持截至 2019 年 1 月的背景地理定位。
    • 我认为最好开始,其他选择是自己编写 Swift/Java/Kotlin 中的代码,然后将其粘贴到 RN
    • @neydroid 感谢分享。 transistorsoft 是一个付费库,其中 mauron85/react-native-background-geolocation 是一个开源库,在我的情况下 mauron85 更好。
    • 截至今天,哪个更适合iOS?
    • O Google deixa bem explicito que mesmo com intervalos menores definidos, as atualizações da geolocalização em Background não passam de algumas vezes por hora。
    【解决方案2】:

    Expo 团队在 SDK 32 中发布了一项新功能,可让您在后台跟踪位置。

    https://expo.canny.io/feature-requests/p/background-location-tracking

    【讨论】:

      【解决方案3】:

      Webkit 目前正在评估一个纯 Javascript 的解决方案。你可以添加你的声音here

      有关完整记录的概念验证示例,请参阅Brotkrumen

      【讨论】:

        【解决方案4】:

        更新 2019 年世博会 33.0.0:

        Expo 首先为他们的 SDK 32.0.0 弃用它以满足应用商店指南,但随后 reopened it in SDK 33.0.0

        从那时起,他们就可以非常轻松地实现后台定位。使用我用来进行后台地理定位工作的这段代码 sn-p。

        import React from 'react';
        import { Text, TouchableOpacity } from 'react-native';
        import * as TaskManager from 'expo-task-manager';
        import * as Location from 'expo-location';
        
        const LOCATION_TASK_NAME = 'background-location-task';
        
        export default class Component extends React.Component {
          onPress = async () => {
            await Location.startLocationUpdatesAsync(LOCATION_TASK_NAME, {
              accuracy: Location.Accuracy.Balanced,
              timeInterval: 5000,
            });
          };
        
          render() {
            return (
              <TouchableOpacity onPress={this.onPress} style={{marginTop: 100}}>
                <Text>Enable background location</Text>
              </TouchableOpacity>
            );
          }
        }
        
        TaskManager.defineTask(LOCATION_TASK_NAME, ({ data, error }) => {
          if (error) {
            alert(error)
            // Error occurred - check `error.message` for more details.
            return;
          }
          if (data) {
            const { locations } = data; 
            alert(JSON.stringify(locations); //will show you the location object
            //lat is locations[0].coords.latitude & long is locations[0].coords.longitude
            // do something with the locations captured in the background, possibly post to your server with axios or fetch API 
          }
        });
        

        代码就像一个魅力。需要注意的一点是,您不能在 Expo 应用程序中使用地理位置。但是,您可以在独立构建中使用它。因此,如果您想使用后台地理位置,您必须使用此代码,然后执行expo build:ios 并上传到应用商店,以便能够获取用户的后台位置。

        另外,请注意您必须包括

        "UIBackgroundModes":[
                  "location",
                  "fetch"
                ]
        

        app.json 文件的info.plist 部分中。

        【讨论】:

        • you can use it in your standalone build 是什么意思。文档说,TaskManager 不适用于 bare 反应原生应用程序
        • expo 不会在 android 后台跟踪位置
        【解决方案5】:

        最流行的 RN 地理定位库是https://github.com/react-native-geolocation/react-native-geolocation,它很容易支持这一点。我更喜欢这个库而不是其他库,因为它会自动处理请求权限等,并且似乎拥有最简单的 API。

        这样做:

        Geolocation.watchPosition((position)=>{
            const {latitude, longitude} = position.coords;
            // Do something.
        })
        

        除了包括背景模式fetchlocation 以及适当的使用说明之外,这不需要其他设置。

        我发现这比 Expo 的 API 更有用,因为它不需要任何奇怪的顶级代码,而且除了创建一个观察位置处理程序之外不需要我做任何事情,这真的很好。

        【讨论】:

        • 它不在后台工作。
        猜你喜欢
        • 2021-12-29
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2016-01-25
        • 1970-01-01
        • 2022-08-04
        • 2016-12-23
        相关资源
        最近更新 更多