118 lines
5.3 KiB
Markdown
118 lines
5.3 KiB
Markdown
## BackgroundTask
|
|
Call a nanoflow when app is in background based on the BackgroundFetch API for Android and iOS.
|
|
|
|
## Features
|
|
Background Fetch is a *very* simple plugin which attempts to awaken an app in the background about **every 15 minutes**, providing a short period of background running-time.
|
|
|
|
This widget is build to incorporate the https://github.com/transistorsoft/react-native-background-fetch into Mendix Native apps
|
|
### iOS
|
|
- There is **no way** to increase the rate which a fetch-event occurs and this plugin sets the rate to the most frequent possible — you will **never** receive an event faster than **15 minutes**. The operating-system will automatically throttle the rate the background-fetch events occur based upon usage patterns. Eg: if user hasn't turned on their phone for a long period of time, fetch events will occur less frequently.
|
|
- [__`scheduleTask`__](#executing-custom-tasks) seems only to fire when the device is plugged into power.
|
|
- ⚠️ When your app is **terminated**, iOS *no longer fires events* — There is *no such thing* as **`stopOnTerminate: false`** for iOS.
|
|
- iOS can take *days* before Apple's machine-learning algorithm settles in and begins regularly firing events. Do not sit staring at your logs waiting for an event to fire. If your [*simulated events*](#debugging) work, that's all you need to know that everything is correctly configured.
|
|
- If the user doesn't open your *iOS* app for long periods of time, *iOS* will **stop firing events**.
|
|
|
|
### Android
|
|
- The Android plugin provides a [HeadlessJS](https://facebook.github.io/react-native/docs/headless-js-android.html) implementation allowing you to continue handling events even after app-termination (see **[`@config enableHeadless`](#config-boolean-enableheadless-false)**)
|
|
|
|
## Usage
|
|
- Clone this Git
|
|
- Go to cloned directory
|
|
- Run: npm i
|
|
- Run: cd ios && pod install
|
|
- Follow steps below:
|
|
|
|
### iOS
|
|
|
|
Select the root of your project. Select Capabilities tab. Enable Background Modes and enable the following mode:
|
|
|
|
- Background fetch
|
|
|
|
<img width="997" alt="68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f732f3976696b356b786f6b6c6b36336f622f696f732d73657475702d6261636b67726f756e642d6d6f6465732e706e673f646c3d31" src="https://user-images.githubusercontent.com/66774568/112835897-2c728c80-909a-11eb-8b4e-9dc8ad3471fb.png">
|
|
|
|
#### Configure Info.plist (iOS 13+)
|
|
|
|
Open your Info.plist and add the key "Permitted background task scheduler identifiers"
|
|
<img width="512" alt="68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f732f7435786667616832676768717477732f696f732d73657475702d7065726d69747465642d6964656e746966696572732e706e673f646c3d31" src="https://user-images.githubusercontent.com/66774568/112835629-cf76d680-9099-11eb-8359-b87fb417a922.png">
|
|
|
|
Add the required identifier com.transistorsoft.fetch.
|
|
|
|
<img width="512" alt="68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f732f6b7764696f327272323536643835322f696f732d73657475702d7065726d69747465642d6964656e746966696572732d6164642e706e673f646c3d31" src="https://user-images.githubusercontent.com/66774568/112835829-16fd6280-909a-11eb-87f4-42a6cff4e025.png">
|
|
|
|
#### AppDelegate.m (iOS 13+)
|
|
```diff
|
|
#import "AppDelegate.h"
|
|
|
|
#import <React/RCTBridge.h>
|
|
#import <React/RCTBundleURLProvider.h>
|
|
#import <React/RCTRootView.h>
|
|
|
|
+//IMPORTANT: Paste import ABOVE the DEBUG macro
|
|
+#import <TSBackgroundFetch/TSBackgroundFetch.h>
|
|
|
|
#if DEBUG
|
|
.
|
|
. ///////////////////////////////////////////////////////////////////////////////////
|
|
. // IMPORTANT: DO NOT paste import within DEBUG macro or archiving will fail!!!
|
|
. ///////////////////////////////////////////////////////////////////////////////////
|
|
.
|
|
#endif
|
|
|
|
@implementation AppDelegate
|
|
|
|
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
|
.
|
|
.
|
|
.
|
|
+//[REQUIRED] Register BackgroundFetch
|
|
+[[TSBackgroundFetch sharedInstance] didFinishLaunching];
|
|
|
|
return YES;
|
|
}
|
|
```
|
|
|
|
### Android
|
|
|
|
#### android/build.gradle
|
|
```diff
|
|
allprojects {
|
|
repositories {
|
|
mavenLocal()
|
|
maven {
|
|
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
|
url("$rootDir/../node_modules/react-native/android")
|
|
}
|
|
maven {
|
|
// Android JSC is installed from npm
|
|
url("$rootDir/../node_modules/jsc-android/dist")
|
|
}
|
|
+ maven {
|
|
+ // react-native-background-fetch
|
|
+ url("${project(':react-native-background-fetch').projectDir}/libs")
|
|
+ }
|
|
|
|
}
|
|
}
|
|
```
|
|
#### Configure proguard-rules.pro
|
|
If you're using __`minifyEnabled true`__ with your Android release build, the plugin's __`HeadlessTask`__ class will be mistakenly *removed* and you will have [this crash](https://github.com/transistorsoft/react-native-background-fetch/issues/261).
|
|
|
|
1. Edit `android/app/proguard-rules.pro`.
|
|
2. Add the following rule:
|
|
|
|
```bash
|
|
# [react-native-background-fetch]
|
|
-keep class com.transistorsoft.rnbackgroundfetch.HeadlessTask { *; }
|
|
```
|
|
## Debug Xcode command:
|
|
```
|
|
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.transistorsoft.fetch"]
|
|
```
|
|
|
|
## Issues, suggestions and feature requests
|
|
https://github.com/IncentroBA/backgroundTask/issues
|
|
|
|
## Development and contribution
|
|
- Bart Onstee
|
|
- https://github.com/transistorsoft/react-native-background-fetch
|