React Nativeでバックグラウンドタスクを実行するにはどうすればよいですか?


82

React Nativeで、位置追跡を行う小さなiOSアプリを作成し、ユーザーが選択したサーバーにlat / lngを定期的に送信します。ただし、これはアプリがフォアグラウンドにある場合にのみ機能します。ユーザーが他のアプリを使用しているときに、このタスクをバックグラウンドで実行するにはどうすればよいですか?


UIBackgroundModesをplist内の場所に設定することで、おそらくこれを行うことができます-こちらをご覧くださいdeveloper.apple.com/library/ios/documentation/UserExperience/…–
Ben Clayton

4
React Nativeには制限があり、アプリがバックグラウンドにある場合、jsブリッジはメッセージの取得を停止します。これは、jsからデータを送信しようとしている場合、それを作成しているデータを信頼できないことを意味します。または、ネイティブコードで更新を送信するコードを記述して、
それでうまくいく

3
@ rmevans9に感謝します。これは良いスタートです。これを見つけた人のために、私はすでにここで少し作業を行っていますgist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec
liamzebedee

1
@liamzebedee答えを受け入れていただけませんか。
ダニエルシュミット2016年

@liamzebedee Swiftでこれらの同じ関数を実装することは可能だと思いますか?
Gabriel Garrett

回答:


62

現在、残念ながら、いかなる種類のバックグラウンドタスクもサポートされていません。あなたが参照している機能は、バックグラウンドタイマーです。このようなタイマーは、React Nativeに対するこの製品の苦痛(機能要求)です。この機能に対する需要の増加を示すために、賛成票を投じることができます。

2016年12月編集:まだ本当の選択肢はありません。RN0.33以降のヘッドレスJSAPIを使用していますが、これはAndroid専用です。また、これがフォアグラウンドで実行されるとアプリがクラッシュするため、使用には注意が必要です。それを指摘してくれた@Fengに感謝します。


2
バックグラウンドタスクはバージョン0.36でサポートされるようになりましたが、Androidのみ
Feng

1
@Feng機能のドキュメントへのリンクはありますか?react-nativeに組み込まれているバックグラウンドタスク機能には何も見つからなかったようです。
Venryx 2016


26

そして今、AndroidとiOSの両方のための単一のAPIであるreact-native-background-taskがあります。


2
さらに、react-native-background-task用に1つ!それは私のreact-native-queueパッケージ(github.com/billmalarky/react-native-queue)と非常によく統合されています。「OSバックグラウンドタスクの完全な例」まで下にスクロールすると、キューがジョブの管理をどのように処理するかを確認できるため、iOSおよびAndroidのバックグラウンドタスクの30秒の制限に対処するのは面倒ではありません。
billmalarky

1
このライブラリをアプリで使用しましたが、定期的に実行するように設定したタスクが実行されませんでした。正常ですか?
simaAttar

2
react-native-background-taskプロジェクトは放棄されたようです。2017年以降、コミットはなく、問題/プルリクエストが山積みになっています。ですから、これはおそらく今日行く方法ではありません。
eega

12

React Nativeエコシステムは、過去数か月にわたって途方もないペースで動いており、バックグラウンドでコードを実行できないという問題に対処するために、いくつかのプラグインが登場しました。

https://github.com/transistorsoft/react-native-background-fetch-定期的に30秒間ウェイクアップして、任意のJSコードを実行します。ウェイクアップの間隔が15分以上になるため、高解像度のジオロケーションには適していません。

https://github.com/transistorsoft/react-native-background-geolocation-特にバックグラウンドでのジオロケーションを対象とした、この状況により適しています。


4
私はこれを使用していますgithub.com/mauron85/react-native-background-geolocationかなり似ているように見えますが、Androidでも無料です。
simlmx 2016年

@simlmx私が反応し、ネイティブ・バックグラウンド・ジオロケーションを使用していたが、それは背景やアプリ近いから定常域を出doen't、ここに私の設定を確認してください stackoverflow.com/questions/61889407/... 事前に、私は任意の助けをいただければ幸いですおかげで
コーヒー

8

これらのライブラリは、目的の機能を実現するのに役立ちます。

  1. react-native-background-job
  2. react-native-background-task
  3. react-native-background-fetch

または、react-nativeのヘッドレスJSを使用することもできます。ただし、Androidでのみ利用できます。


アプリでreact-native-background-fetchライブラリを使用しましたが、必要なタスクを1日に数回しか実行しません。正常ですか?
simaAttar

8

私はこれを使用していますが、機能しているようです:https//github.com/ocetnik/react-native-background-timer

定期的にイベントを発行します(アプリがバックグラウンドにある場合でも)。

setInterval関数とsetTimeout関数を使用できます。このAPIはreact-nativeのAPIと同じであり、既存のタイマーをバックグラウンドタイマーにすばやく置き換えるために使用できます。

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);

ありがとう!しかし、プロセスからアプリを強制終了すると、このモジュールは機能しません。アプリを強制終了しても機能する同様のモジュールはありますか?
Kholiavko 2017年

@Kholiavko申し訳ありませんが、いいえ。私はあなたが警報サービスの使用を通してそれを達成することができることを知っています、しかしあなたがそうするのを助けるモジュールを知りません。
Venryx 2017年

@Kholiavko運がいいですか?
チャペルジュース2017

1
@chapeljuice、はい、このモジュールを参照してくださいgithub.com/vikeri/react-native-background-job
Kholiavko

こんにちは!このプラグインはAndroidのみのようです。iOS用のソリューションを知っていますか?
サイモンエリアソン2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.