Làm cách nào để chạy các tác vụ nền trong React Native?


81

Tôi đã xây dựng một ứng dụng iOS nhỏ trong React Native có chức năng theo dõi vị trí, gửi lat / lng thường xuyên tới máy chủ do người dùng lựa chọn. Tuy nhiên, điều này chỉ hoạt động khi ứng dụng ở nền trước. Làm cách nào tôi có thể chạy tác vụ này trong nền khi người dùng đang ở trong các ứng dụng khác?


Bạn có thể thực hiện việc này bằng cách đặt UIBackgroundModes thành vị trí trong plist - hãy xem tại đây developer.apple.com/library/ios/documentation/UserExperience/…
Ben Clayton

4
Có một hạn chế trong React Native trong đó khi ứng dụng ở chế độ nền, cầu nối js ngừng nhận thông báo. Điều này có nghĩa là nếu bạn đang cố gắng gửi dữ liệu từ js thì bạn sẽ không thể tin vào dữ liệu tạo ra nó. Hoặc bạn có thể viết mã để gửi các bản cập nhật trong mã nguồn gốc và rằng nên làm các trick
rmevans9

3
Thansk @ rmevans9 đây là một khởi đầu tốt. Đối với bất cứ ai tìm thấy này, tôi đã làm một chút công việc ở đây gist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec
liamzebedee

1
@liamzebedee Bạn có phiền chấp nhận câu trả lời không?
Daniel Schmidt

@liamzebedee Bạn có nghĩ rằng có thể triển khai các chức năng tương tự này trong Swift không?
Gabriel Garrett

Câu trả lời:


61

Hiện tại, rất tiếc, không có hỗ trợ cho các tác vụ nền thuộc bất kỳ loại nào. Tính năng bạn đang đề cập đến sẽ là bộ đếm thời gian chạy nền. Bộ đếm thời gian như vậy là nỗi đau của sản phẩm này (một yêu cầu tính năng) cho phản ứng gốc, bạn có thể ủng hộ nó để cho thấy nhu cầu ngày càng tăng đối với tính năng này.

EDIT 12/2016: Vẫn không có tùy chọn thực sự. Bạn có API Headless JS kể từ RN 0.33, nhưng nó chỉ dành cho Android. Ngoài ra, ứng dụng của bạn sẽ gặp sự cố nếu điều này chạy ở phía trước, vì vậy bạn phải cẩn thận khi sử dụng nó. Cảm ơn @Feng đã chỉ ra điều đó.


2
tác vụ nền hiện được hỗ trợ trong phiên bản 0.36, nhưng chỉ dành cho Android
Feng

1
@Feng Bạn có liên kết đến các tài liệu cho tính năng này không? Tôi dường như không thể tìm thấy bất kỳ thứ gì trên tính năng tác vụ nền được tích hợp sẵn để phản ứng gốc.
Venryx


26

Và bây giờ có react-native-background-task là một API duy nhất cho cả Android và iOS.


2
Thêm một cho tác vụ phản ứng-gốc-nền-nền! Nó tích hợp thực sự tốt với gói react -native-queue của tôi ( github.com/billmalarky/react-native-queue ). Nếu bạn cuộn xuống "Ví dụ đầy đủ về tác vụ nền của hệ điều hành", bạn có thể thấy cách hàng đợi xử lý việc quản lý công việc cho bạn vì vậy giới hạn 30 giây đối với các tác vụ nền iOS và Android không phải là vấn đề đáng lo ngại.
billmalarky

1
Tôi đã sử dụng thư viện này trong ứng dụng của mình, nhưng nó không chạy tác vụ mà tôi đặt để chạy thường xuyên. Nó có bình thường không??
simaAttar 25/09/19

1
Dự án react-native-background-task dường như bị bỏ rơi. Không có cam kết nào kể từ năm 2017 và các vấn đề / yêu cầu kéo đang chất đống. Vì vậy, đây có lẽ không phải là cách để đi ngày nay.
eega

12

Hệ sinh thái React Native đã phát triển với tốc độ chóng mặt trong vài tháng qua và một số plugin đã xuất hiện để giải quyết vấn đề không thể chạy mã trong nền.

https://github.com/transistorsoft/react-native-background-fetch - Định kỳ thức dậy trong 30 giây để chạy một số mã JS tùy ý. Không phù hợp với định vị địa lý có độ phân giải cao, vì thời gian giữa các lần thức dậy sẽ là 15 phút hoặc hơn.

https://github.com/transistorsoft/react-native-background-geolocation - Phù hợp hơn với tình huống này, nhắm mục tiêu cụ thể vào vị trí địa lý trong nền.


4
Tôi đang sử dụng github.com/mauron85/react-native-background-geolocation này có vẻ khá giống nhưng cũng miễn phí cho Android.
simlmx

@simlmx Tôi đã sử dụng react-native-background-geolocation nhưng nó không thoát khỏi vùng cố định khỏi nền hoặc đóng ứng dụng. Vui lòng kiểm tra cấu hình của tôi tại đây stackoverflow.com/questions/61889407/… Tôi sẽ đánh giá cao mọi sự trợ giúp, cảm ơn trước
cà phê

@coffee, repo đó chỉ hoạt động ở chế độ nền trước
felansu

8

Các thư viện này có thể giúp bạn đạt được chức năng mong muốn của mình:

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

Ngoài ra, bạn có thể sử dụng Headless JS từ react-native. Nhưng nó chỉ có sẵn cho Android.


Tôi đã sử dụng thư viện react-native-background-fetch trong ứng dụng của mình, nhưng nó chỉ chạy các tác vụ mong muốn vài lần mỗi ngày. Nó có bình thường không??
simaAttar 25/09/19

7

Tôi sử dụng cái này và nó có vẻ hoạt động: https://github.com/ocetnik/react-native-background-timer

Phát ra sự kiện theo định kỳ (ngay cả khi ứng dụng ở chế độ nền).

Bạn có thể sử dụng các hàm setInterval và setTimeout. API này giống với API phản ứng gốc và có thể được sử dụng để nhanh chóng thay thế các bộ định thời hiện có bằng bộ định thời nền.

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

Cảm ơn! Nhưng mô-đun này không hoạt động nếu tôi giết ứng dụng khỏi quy trình, bây giờ bạn có mô-đun tương tự, hoạt động ngay cả khi tôi sẽ giết ứng dụng?
Kholiavko

@Kholiavko Xin lỗi, không. Tôi biết bạn có thể thực hiện điều đó thông qua việc sử dụng dịch vụ báo động, nhưng không biết có mô-đun nào giúp bạn làm như vậy.
Venryx

@Kholiavko có may mắn không?
chapeljuice

1
@chapeljuice, vâng, xem module này github.com/vikeri/react-native-background-job
Kholiavko

Xin chào! Plugin này dường như chỉ dành cho Android. Bạn có biết giải pháp nào cho iOS không?
Simon Eliasson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.