react-native - 应用程序后台运行时无法使任何传感器工作 [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 在这两种方法中都可以工作。所以我的猜测是传感器只是不在后台工作?
解决方案
推荐阅读
- python - 找不到如何编译自定义 MIB 以在我的简单 python SNMP 工具中使用
- javascript - Javascript:你能检查一个对象是否有一个包含另一个键的键
- elasticsearch - 按查询 API 删除会抛出类型 [[_delete_by_query,尝试自动创建映射,但动态映射已禁用]] 缺失]
- azure - 日志分析工作区中的 Azure DB 同步日志
- python - 从另一个调用 Google Cloud 函数
- python - 函数实例化类的命名约定
- laravel - Laravel/Eloquent whereIn/where 有一对集合
- google-sheets - Google 表格 - 基于包含特定公式的单元格的条件格式
- networking - FIN-ACK 数据包是从服务器发送的,但客户端在客户端发送 FIN-ACK 数据包之前发送 HTTP 请求
- android - E/chromium: [ERROR:gl_surface_egl.cc(571)] eglChooseConfig 失败,出现错误 EGL_BAD_ATTRIBUTE for android tv