首页 > 解决方案 > 应用程序后台运行时无法使任何传感器工作 [Expo (React-Native)]

问题描述

我正在运行 SDK 39.0.0 并使用 Expo 为 Android/iOS 制作本机应用程序。

到目前为止,一切都很顺利,但我偶然发现了一个问题:我正在尝试从传感器(准确地说是加速度计)获取读数,它工作得非常好,但是当应用程序处于后台时它就不行了。

我已经尝试使用带有TaskManager的BackgroundFetch来完成此操作,但主要问题是我需要以正确的时间间隔(每 100 毫秒)从传感器获取数据,而 BackgroundFetch API 无法做到这一点。

我在这篇文章中找到了一种解决方法,它使用WebView组件在每个间隔(100 毫秒)内不断运行一个函数。这确实有效(在前台和后台),我已经尝试过console.log,但是当应用程序后台运行时传感器侦听Accelerometer.addListener()不再被调用这对于使用 BackgroundFetch 的官方方法和使用 WebView 的非官方方法都会发生。所以我的猜测是传感器只是不在后台工作?

我希望有人能帮我解决这个问题,因为这个功能对我的期末学校项目非常重要。脱离世博也不是一种选择。提前致谢。

这是使后台任务成为可能的“解决方法”代码:

import * as React from 'react';
import { WebView } from 'react-native-webview';

export default function BackgroundTask(props) {
  return (
    <WebView
      onMessage={props.function}
      source={{
        html: `<script>
          setInterval(()=>{window.ReactNativeWebView.postMessage("");}, ${props.interval})
          </script>`,
      }}
    />
  );
}

}

这是实现“解决方法”后台工作代码的代码(调用加速度计并保存数据):

import { Accelerometer } from 'expo-sensors';
import React, { useState, useEffect } from 'react';
import BackgroundTask from '../background-workers/BackgroundTask';

export default function BackgroundTaskTest() {
  const [data, setData] = useState({});

  useEffect(() => {
    const accelSub = Accelerometer.addListener((accelerometerData) => {
      setData(accelerometerData);
    });

    if (accelSub) {
      return function cleanup() {
        accelSub.remove();
      };
    }
  });

  const updateAcc = () => console.log('Data:', data.x, data.y, data.z);
  /*This returned component does basically return no actual View, it just
  constantly repeats the updateAcc() function (foreground and background)*/
  return <BackgroundTask interval={100} function={updateAcc} />;
}

请记住,加速度计在官方方法(使用 BackgroundFetch)和非官方方法(使用上面显示的 WebView 方法)中都没有做任何事情,而简单的console.log()DOES 在这两种方法中都可以工作。所以我的猜测是传感器只是不在后台工作?

标签: react-nativeexpo

解决方案


推荐阅读