与 iOS 相比,Android 上的地理围栏速度较慢

问题描述 投票:0回答:1

我正在开发一个裸世博项目,该项目使用 Location SDK (https://docs.expo.io/versions/latest/sdk/location/) 来对某个区域进行地理围栏。

地理围栏在 iOS 上运行良好,但在 Android 上,它在后台(或当应用程序被强制退出时)可能会非常慢。退出或进入地理围栏时,有时可能需要超过 15 分钟才能运行注册的任务。

我还注意到,如果我打开 Google 地图等应用程序并点击 GPS 按钮,我可以强制触发注册的地理围栏任务运行。

是否可以以某种方式加快位置更新速度,或者在 Android Studio 中配置某些内容?

package.json 包括:

  • "博览会地点": "^12.0.4",
  • “博览会通知”:“^0.11.5”,
  • “博览会权限”:“^12.0.1”,
  • "expo-task-manager": "^9.0.0",
  • “反应”:“17.0.1”,
  • “反应本机”:“0.64.1”,

如果您还需要什么,请告诉我。

import React, { useEffect, useState } from "react";
import { StyleSheet, Text, View } from "react-native";
import {
  getForegroundPermissionsAsync,
  requestBackgroundPermissionsAsync,
  requestForegroundPermissionsAsync,
  startGeofencingAsync,
} from "expo-location";
import * as Notifications from "expo-notifications";
import { LocationGeofencingEventType } from "expo-location";
import * as TaskManager from "expo-task-manager";

Notifications.setNotificationHandler({
  handleNotification: async () => ({
    shouldShowAlert: true,
    shouldPlaySound: false,
    shouldSetBadge: false,
  }),
});

TaskManager.defineTask(
  "GEOFENCE_TASK",
  ({ data: { eventType, region }, error }) => {
    if (error) {
      // check `error.message` for more details.
      return;
    }
    if (eventType === LocationGeofencingEventType.Enter) {
      console.log("You've entered region:", region);
      Notifications.scheduleNotificationAsync({
        content: {
          title: "ENTERED GEOFENCE",
          body: region.identifier,
        },
        trigger: null,
      });
    } else if (eventType === LocationGeofencingEventType.Exit) {
      console.log("You've left region:", region);
      Notifications.scheduleNotificationAsync({
        content: {
          title: "EXITED GEOFENCE",
          body: region.identifier,
        },
        trigger: null,
      });
    }
  }
);

export default function App() {
  const [isLoading, setIsLoading] = useState(true);
  useEffect(() => {
    const setUp = async () => {
      const { granted: notificationsGranted } =
        await Notifications.getPermissionsAsync();
      if (!notificationsGranted) {
        await Notifications.requestPermissionsAsync();
      }
      const { granted: fgGranted } = await getForegroundPermissionsAsync();
      if (!fgGranted) {
        await requestForegroundPermissionsAsync();
        await requestBackgroundPermissionsAsync();
      }

      const geofences = [
        {
          identifier: "Stockholm",
          latitude: 59.332598,
          longitude: 18.035258,
          radius: 100,
          notifyOnEnter: true,
          notifyOnExit: true,
        },
      ];
      await startGeofencingAsync("GEOFENCE_TASK", geofences);
    };

    setUp();
  }, []);

  return (
    <View style={styles.container}>
      {isLoading ? <Text>App is Loading</Text> : <Text>Loading done</Text>}
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    alignItems: "center",
    justifyContent: "center",
  },
});
react-native expo android-geofence
1个回答
2
投票

我发现了同样的“问题”,为了缓解它,我使用前台通知来改进地理围栏服务。

好消息是这个技巧在“应用程序正在使用”权限下效果很好。 (但后台位置权限是必须的)

问候。

© www.soinside.com 2019 - 2024. All rights reserved.