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

添加后,你必须至少启用 Background fetch 和 Background processing 模式,才能注册和调度后台任务。
如果你将使用地理定位或推送通知,请分别启用 Location updates 或 Remote notifications。

启用后台模式功能后,将以下代码添加到应用的 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(隐私 - 始终使用位置说明)NSLocationWhenInUseUsageDescription(隐私 - 在使用期间使用位置说明)
有关在 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:
<!-- 地理定位 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 应用面临的挑战是,当这些后台事件发生时,Web 视图不可用,这要求你编写原生代码来处理这些事件。这就是 Background Runner 插件的用武之地。
Background Runner 让你可以轻松编写 JavaScript 代码来处理原生后台事件。你只需要创建运行器 JavaScript 文件并 定义配置,然后 Background Runner 插件会自动配置和调度一个原生后台任务,该任务将根据你的配置和平台规则执行。无需修改你的 UI 代码。
使用 Background Runner
Background Runner 包含一个无头 JavaScript 环境,它调用你在 capacitor.config.ts 文件中指定的 JavaScript 文件中的事件处理程序。如果运行器在你的运行器文件中找到与传入事件对应的事件处理程序,它将执行该事件处理程序,然后在调用 resolve() 或 reject() 后关闭(或者如果操作系统强制终止你的进程)。
运行器 JS 文件示例
addEventListener('myCustomEvent', (resolve, reject, args) => {
console.log('在这里执行一些操作来更新系统');
resolve();
});
addEventListener('myCustomEventWithReturnData', (resolve, reject, args) => {
try {
console.log('接收到的数据:' + 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('收到静默推送通知');
CapacitorNotifications.schedule([
{
id: 100,
title: '企业级 Background Runner',
body: '收到静默推送通知',
},
]);
resolve();
} catch (err) {
reject();
}
});
在每个由运行器调用的事件处理程序中,调用 resolve() \ reject() 是 必需 的。如果不这样做,当你的事件在应用处于后台时被调用,可能会导致运行器被操作系统终止。如果应用在前台,对 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 暴露了相关的移动设备功能。