@capacitor/background-runner
Background Runner 提供了一个基于事件的独立 JavaScript 环境,用于在 Web 视图之外执行您的 JavaScript 代码。
安装
npm install @capacitor/background-runner
npx cap sync
Background Runner 支持多种设备 API,这些 API 需要用户事先授权。
iOS
在 iOS 上,您必须启用 Background Modes 功能。

添加后,您必须至少启用 Background fetch 和 Background processing 模式,才能注册和调度后台任务。
如果您将使用 Geolocation 或 Push Notifications,请分别启用 Location updates 或 Remote notifications。

启用 Background Modes 功能后,将以下内容添加到您的应用的 AppDelegate.swift 中:
在文件顶部,import Capacitor 下方添加:
import CapacitorBackgroundRunner
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ....
BackgroundRunnerPlugin.registerBackgroundTask()
BackgroundRunnerPlugin.handleApplicationDidFinishLaunching(launchOptions: launchOptions)
// ....
return true
}
要允许 Background Runner 处理远程通知,请添加以下内容:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// ....
BackgroundRunnerPlugin.dispatchEvent(event: "remoteNotification", eventArgs: userInfo) { result in
switch result {
case .success:
completionHandler(.newData)
case .failure:
completionHandler(.failed)
}
}
}
Geolocation(地理位置)
Apple 要求在 Info.plist 中为位置信息指定隐私描述:
NSLocationAlwaysUsageDescription(Privacy - Location Always Usage Description)NSLocationWhenInUseUsageDescription(Privacy - Location When In Use Usage Description)
阅读 iOS 指南 中关于 配置 Info.plist 的内容,了解更多关于在 Xcode 中设置 iOS 权限的信息。
Android
在 android/app/build.gradle 中插入以下内容:
...
repositories {
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
+ dirs '../../node_modules/@capacitor/background-runner/android/src/main/libs', 'libs'
}
}
...
如果您从 1.0.5 升级且现有 Android 项目,请确保从 android/src/main/libs 中删除 android-js-engine-release.aar。
Geolocation(地理位置)
此 API 需要在您的 AndroidManifest.xml 中添加以下权限:
<!-- Geolocation API -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
前两个权限请求位置数据(粗略和精确),最后一行是可选的,但如果您的应用需要 GPS 功能,则必须添加。您可以省略它,但请注意这可能导致您的应用安装在缺乏 GPS 硬件的设备上。
Local Notifications(本地通知)
Android 13 需要权限检查才能发送通知。您需要相应地调用 checkPermissions() 和 requestPermissions()。
在 Android 12 及更早版本上,不会显示提示,直接返回已授权。
从 Android 12 开始,除非在 AndroidManifest.xml 中添加此权限,否则定时通知不会精确执行:
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
请注意,即使存在此权限,用户仍然可以从应用设置中禁用精确通知。
阅读 Android 指南 中关于 设置权限 的内容,了解更多关于设置 Android 权限的信息。
关于 Background Runner
在构建复杂应用的过程中,有时需要在应用不在前台时执行工作。标准 Capacitor 应用的挑战在于,当这些后台事件发生时,WebView 不可用,这要求您编写原生代码来处理这些事件。Background Runner 插件就是为了解决这个问题而生的。
Background Runner 使得编写 JavaScript 代码来处理原生后台事件变得简单。您需要做的就是创建 runner JavaScript 文件并定义您的配置,然后 Background Runner 插件将自动配置和调度一个原生后台任务,该任务将根据您的配置和平台规则执行。无需修改您的 UI 代码。
使用 Background Runner
Background Runner 包含一个无头 JavaScript 环境,用于调用您在 capacitor.config.ts 文件中指定的 JavaScript 文件中的事件处理器。如果 runner 在您的 runner 文件中找到与传入事件对应的事件处理器,它将执行该事件处理器,然后在调用 resolve() 或 reject() 后关闭(或如果操作系统强制终止您的进程)。
Runner JS 文件示例
addEventListener('myCustomEvent', (resolve, reject, args) => {
console.log('do something to update the system here');
resolve();
});
addEventListener('myCustomEventWithReturnData', (resolve, reject, args) => {
try {
console.log('accepted this data: ' + JSON.stringify(args.user));
const updatedUser = args.user;
updatedUser.firstName = updatedUser.firstName + ' HELLO';
updatedUser.lastName = updatedUser.lastName + ' WORLD';
resolve(updatedUser);
} catch (err) {
reject(err);
}
});
addEventListener('remoteNotification', (resolve, reject, args) => {
try {
console.log('received silent push notification');
CapacitorNotifications.schedule([
{
id: 100,
title: 'Enterprise Background Runner',
body: 'Received silent push notification',
},
]);
resolve();
} catch (err) {
reject();
}
});
在 runner 调用的每个事件处理器中必须调用 resolve() / reject()。如果未能做到这一点,当应用在后台时您的事件被调用,可能会导致您的 runner 被操作系统杀死。如果应用在前台,对 dispatchEvent 的异步调用可能无法 resolve。
更多使用 Background Runner 的实际示例,请查看 Background Runner Test App。
配置 Background Runner
加载时,Background Runner 将自动注册一个后台任务,该任务将在您的应用进入后台后被调度和执行。
| 属性 | 类型 | 描述 | 始于 |
|---|---|---|---|
label | string | runner 的名称,用于日志记录。 | 1.0.0 |
src | string | runner JavaScript 文件的路径,相对于应用包。 | 1.0.0 |
event | string | 当操作系统执行后台任务时将调用的事件名称。 | 1.0.0 |
repeat | boolean | 后台任务是否应根据 interval 中设置的时间间隔重复执行。 | 1.0.0 |
interval | number | 应用进入后台后,后台任务开始执行的分钟数。如果 repeat 为 true,这也指定了每次执行之间的分钟数。 | 1.0.0 |
autoStart | boolean | 是否在应用加载时自动注册和调度后台任务。 | 1.0.0 |
示例
在 capacitor.config.json 中:
{
"plugins": {
"BackgroundRunner": {
"label": "com.example.background.task",
"src": "runners/background.js",
"event": "myCustomEvent",
"repeat": true,
"interval": 15,
"autoStart": true
}
}
}
在 capacitor.config.ts 中:
/// <reference types="@capacitor/background-runner" />
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
plugins: {
BackgroundRunner: {
label: "com.example.background.task",
src: "runners/background.js",
event: "myCustomEvent",
repeat: true,
interval: 15,
autoStart: true,
},
},
};
export default config;