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

Posted

技术标签:

【中文标题】与 iOS 相比,Android 上的地理围栏速度较慢【英文标题】:Geofencing is Slow on android compared to iOS 【发布时间】:2021-05-20 14:15:43 【问题描述】:

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

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

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

是否有可能以某种方式加速位置更新,或者在 Android Studio 中配置一些东西?

package.json 包括:

“展会地点”:“^12.0.4”, “展会通知”:“^0.11.5”, "expo-permissions": "^12.0.1", "expo-task-manager": "^9.0.0", “反应”:“17.0.1”, “react-native”:“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",
  ,
);

【问题讨论】:

【参考方案1】:

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

好消息是,该技巧适用于“使用中的应用”权限。 (但后台位置权限是强制性的)

问候。

【讨论】:

你用什么包/sdk来做前台通知?是否注意到任何明显的电池消耗? 免责声明,我在 HEROW 工作,我们提供基于地理围栏的 SDK。我通过编写一个简单的前台服务来做到这一点。 (developer.android.com/guide/components/foreground-services)。 Offcourse 电池消耗更多,但只要告知使用情况是可以接受的。

以上是关于与 iOS 相比,Android 上的地理围栏速度较慢的主要内容,如果未能解决你的问题,请参考以下文章

Android O 地理围栏触发延迟

iOS 上的 Cordova 地理围栏和 iBeacon 插件冲突

Android 8 或 9 上的后台地理围栏不起作用

没有 requestLocationUpdates 不会触发 Android 地理围栏

在哪里可以找到适用于 Android Studio 3.3 的未弃用地理围栏示例代码?

Android如何知道地理围栏何时过期?