@capacitor/background-runner
Background Runner 提供了一个基于事件的独立 JavaScript 环境,用于在 WebView 之外执行你的 JavaScript 代码。
安装
npm install @capacitor/background-runner
npx cap sync
Background Runner 支持多种设备 API,这些 API 在使用前需要获得用户的许可。
iOS
在 iOS 上,你必须启用 Background Modes(后台模式)能力。

添加后,你至少需要启用 Background fetch 和 Background processing 模式,才能注册和调度后台任务。
如果你将使用地理位置或推送通知功能,请分别启用 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)
}
}
}
地理位置
Apple 要求在 Info.plist 中为位置信息指定隐私描述:
NSLocationAlwaysUsageDescription(Privacy - Location Always Usage Description)NSLocationWhenInUseUsageDescription(Privacy - Location When In Use Usage Description)
有关在 Xcode 中设置 iOS 权限的更多信息,请阅读 iOS 指南 中的 配置 Info.plist 部分。
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 文件。
地理位置
此 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 硬件的设备上。
本地通知
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 的异步调用可能不会解析。
有关使用 Background Runner 的更多实际示例,请查看 Background Runner 测试应用。## 配置后台运行器
加载时,后台运行器会自动注册一个后台任务,当应用进入后台时,该任务将被调度并执行。
| 属性 | 类型 | 描述 | 始于 |
|---|---|---|---|
label | string | 运行器的名称,用于日志记录。 | 1.0.0 |
src | string | 运行器 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;
JavaScript API
后台运行器不在浏览器或 Web 视图中执行你的 JavaScript 代码,因此你可能习惯的典型 Web API 可能不可用。这包括 DOM API 以及与应用程序 DOM 交互的能力。
以下是后台运行器中提供的可用 Web API 列表:
- console
- 仅
info、log、warn、error和debug可用
- 仅
- TextDecoder
- 仅
decode可用
- 仅
- TextEncoder
- 仅
encode可用
- 仅
- addEventListener
- 不支持事件监听器选项和
useCapture
- 不支持事件监听器选项和
- setTimeout
- setInterval
- clearTimeout
- clearInterval
- crypto
- fetch
- 尚不支持 Request 对象
- 在 options 对象中仅支持
method、headers和body
除了标准的 Web API 外,后台运行器还支持一些自定义的 Capacitor API,这些自定义 API 暴露了相关的移动设备功能。