[javascript] React Native에서 백그라운드 작업을 어떻게 실행할 수 있습니까?

위치 추적을 수행하는 React Native에서 사용자가 선택한 서버에 lat / lng를 정기적으로 보내는 작은 iOS 앱 을 구축했습니다 . 그러나 이것은 앱이 포 그라운드에있을 때만 작동합니다. 사용자가 다른 앱에있을 때이 작업을 백그라운드에서 어떻게 실행할 수 있습니까?



답변

현재 유감스럽게도 어떤 종류의 백그라운드 작업도 지원하지 않습니다. 당신이 언급하는 기능은 백그라운드 타이머입니다. 이러한 타이머는 반응 네이티브에 대한 이 제품의 고통 (기능 요청) 이며,이 기능에 대한 수요 증가를 보여주기 위해 upvote 할 수 있습니다.

2016 년 12 월 수정 : 아직 실제 옵션이 없습니다. 당신은이 머리없는 JS의 RN 0.33 이후 API를하지만, 안드로이드 전용입니다. 또한 이것이 포 그라운드에서 실행되면 앱이 충돌하므로 사용에 대해주의해야합니다. 지적 해 주신 @Feng에게 감사드립니다.


답변

이제 Android 및 iOS 용 단일 API 인 react-native-background-task 가 있습니다.


답변

React Native 생태계는 지난 몇 달 동안 엄청난 속도로 움직이고 있으며 백그라운드에서 코드를 실행할 수없는 고통을 해결하기 위해 몇 가지 플러그인이 등장했습니다.

https://github.com/transistorsoft/react-native-background-fetch- 임의의 JS 코드를 실행하기 위해 주기적으로 30 초 동안 깨어납니다. 깨우기 사이의 시간이 15 분 이상이므로 고해상도 지리적 위치에는 적합하지 않습니다.

https://github.com/transistorsoft/react-native-background-geolocation- 특히 백그라운드의 지리적 위치를 대상으로하는이 상황에 더 적합합니다.


답변

이러한 라이브러리는 원하는 기능을 달성하는 데 도움이 될 수 있습니다.

  1. 반응 네이티브 백그라운드 작업
  2. 반응 네이티브 백그라운드 작업
  3. 반응 네이티브 배경 가져 오기

또는 react-native에서 Headless JS 를 사용할 수 있습니다 . 그러나 Android에서만 사용할 수 있습니다.


답변

나는 이것을 사용하고 작동하는 것 같습니다 : https://github.com/ocetnik/react-native-background-timer

주기적으로 이벤트를 내 보냅니다 (앱이 백그라운드에있는 경우에도).

setInterval 및 setTimeout 함수를 사용할 수 있습니다. 이 API는 react-native와 동일하며 기존 타이머를 백그라운드 타이머로 빠르게 교체하는 데 사용할 수 있습니다.

import BackgroundTimer from 'react-native-background-timer';

// Start a timer that runs continuous after X milliseconds
const intervalId = BackgroundTimer.setInterval(() => {
    // this will be executed every 200 ms
    // even when app is the background
    console.log('tic');
}, 200);

// Cancel the timer when you are done with it
BackgroundTimer.clearInterval(intervalId);

// Start a timer that runs once after X milliseconds
const timeoutId = BackgroundTimer.setTimeout(() => {
    // this will be executed once after 10 seconds
    // even when app is the background
    console.log('tac');
}, 10000);

// Cancel the timeout if necessary
BackgroundTimer.clearTimeout(timeoutId);


답변