后台运行器提供了一个基于事件的独立 JavaScript 环境,用于在WebView之外执行您的 JavaScript 代码。
npm install @jigra/background-runner
npx jig sync
后台运行器支持各种需要用户在使用前授予权限的设备 API。
在 iOS 上,您必须启用后台模式功能。
一旦添加,您至少必须启用 后台检索
和 后台处理
模式,以启用注册和安排后台任务的能力。
如果您将使用地理位置或推送通知,请分别启用 位置更新
或 远程通知
。
在启用后台模式功能后,将以下内容添加到应用程序的 AppDelegate.swift
在文件顶部,在 import Jigra
下方添加
import JigraBackgroundRunner
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ....
BackgroundRunnerPlugin.registerBackgroundTask()
BackgroundRunnerPlugin.handleApplicationDidFinishLaunching(launchOptions: launchOptions)
// ....
return true
}
为了允许后台运行器处理远程通知,添加以下内容
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
(隐私 - 使用时使用位置描述
)
有关在 配置 Info.plist
的更多信息,请访问 iOS 指南
将以下行插入到 android/app/build.gradle
...
repositories {
flatDir{
dirs '../jigra-cordova-android-plugins/src/main/libs', 'libs'
+ dirs '../../node_modules/@jigra/background-runner/android/src/main/libs', 'libs'
}
}
...
如果您是从现有 Android 项目中升级到 1.0.0,请确保从 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 指南
在构建复杂应用程序的过程中,有时需要在应用不在前台时执行工作。标准 Jigra 应用程序的一个挑战是,当这些后台事件发生时,WebView 不可用,这要求您编写本地代码来处理这些事件。这就是后台运行器插件发挥作用的地方。
背景运行器让编写JavaScript代码处理本地后台事件变得简单。您只需要创建自己的运行器JavaScript文件,并在定义配置后,背景运行器插件将自动配置和安排一个根据您配置和平台规则的本地后台任务。不需要修改您的UI代码。
背景运行器包含一个无头JavaScript环境,在您的jigra.config.ts
文件中指定的JavaScript文件中调用事件处理器。如果运行器在您的运行器文件中找到对应于传入事件的处理器,它将执行事件处理器,然后在调用resolve()
或reject()
后关闭(或在操作系统强制终止您的进程时)。
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');
JigraNotifications.schedule([
{
id: 100,
title: 'Enterprise Background Runner',
body: 'Received silent push notification',
},
]);
resolve();
} catch (err) {
reject();
}
});
在运行器调用的每个事件处理器中,调用resolve()
\ reject()
是必需的。如果没有这么做,如果在应用处于后台时事件被调用,操作系统可能会终止您的运行器。如果应用处于前台,异步的dispatchEvent
调用可能不会解析。
在加载时,背景运行器将自动注册一个后台任务,当您的应用进入后台时,将安排和运行此任务。
属性 | 类型 | 描述 | 自 |
---|---|---|---|
标签 |
字符串 |
运行器的名称,用于日志中。 | 1.0.0 |
src |
字符串 |
运行器JavaScript文件的路径,相对于应用包。 | 1.0.0 |
事件 |
字符串 |
当操作系统执行后台任务时将被调用的事件名称。 | 1.0.0 |
重复 |
布尔型 |
如果后台任务应根据interval 中设置的间隔重复。 |
1.0.0 |
间隔 |
数字 |
该数字是指在该应用被置于后台后多少分钟启动后台任务。如果repeat 为true,这也指定了每次执行之间的分钟数。 |
1.0.0 |
自动启动 |
布尔型 |
在应用加载时自动注册和安排后台任务。 | 1.0.0 |
在jigra.config.json
{
"plugins": {
"BackgroundRunner": {
"label": "com.example.background.task",
"src": "runners/background.js",
"event": "myCustomEvent",
"repeat": true,
"interval": 15,
"autoStart": true
}
}
}
在jigra.config.ts
/// <reference types="@jigra/background-runner" />
import { JigraConfig } from '@jigra/cli';
const config: JigraConfig = {
plugins: {
BackgroundRunner: {
label: "com.example.background.task",
src: "runners/background.js",
event: "myCustomEvent",
repeat: true,
interval: 15,
autoStart: true,
},
},
};
export default config;
背景运行器不在浏览器或web视图中执行您的JavaScript代码,因此您可能习惯的典型Web API可能不可用。这包括DOM API以及与您的应用DOM交互的能力。
以下是背景运行器提供的可用Web API列表
- 控制台
- 仅支持
info
、log
、warn
、error
和debug
- 仅支持
- TextDecoder
- 仅支持
decode
- 仅支持
- TextEncoder
- 仅支持
encode
- 仅支持
- addEventListener
- 不支持事件监听器选项和
useCapture
- 不支持事件监听器选项和
- setTimeout
- setInterval
- clearTimeout
- clearInterval
- crypto
- fetch
- 请求对象尚不支持
- 在选项对象中仅支持
method
、headers
和body
除了标准Web API之外,背景运行器还支持一些自定义Jigra API,这些API可以公开相关的移动设备功能。
目前,运行器是为在应用后台执行周期性工作负载,或在应用处于前台时在不同于UI的线程中执行异步工作而设计的。因此,运行器不会长时间存活。状态在调用运行器的事件之间不会保留。每次调用dispatchEvent()
都会创建一个新的上下文,用于加载和执行运行器代码,并在调用resolve()
或reject()
后销毁上下文。
一些安卓设备厂商提供了超越原生安卓功能的内置电池优化设置。其中一些优化设置必须由最终用户禁用,以确保您的后台任务能够正常工作。
访问不要杀了我的应用!以获取有关受影响厂商和用户调整设置所需的步骤的更多信息。
在移动操作系统上无法运行持续运行的后台服务。由于iOS和Android为减少电池和数据消耗而设定的限制,后台任务受限于各种限制,您在设计和实施后台任务时必须牢记。
- 您的任务每次调用前的执行时间大约为30秒,之后您必须调用
completed()
或者您的任务将被终止。 - 虽然您可以为任务设置一个间隔以定义后台开始运行的时间,或者它应该运行的频率,但这并不保证。iOS将决定任务最终何时以及多频繁运行,部分取决于您使用应用频率。
- 后台任务在模拟器中不会执行。
- 您的任务有最多10分钟的时间来执行工作,但为了保持跨平台兼容性,您应该限制工作在30秒以内。
- 重复后台任务的间隔至少为15分钟。类似iOS,您请求的任何间隔可能不会完全满足实际执行时间,这取决于操作系统电池优化和其他启发式算法。
checkPermissions() => any
检查各种Jigra设备API权限。
返回: any
自 1.0.0
requestPermissions(options: RequestPermissionOptions) => any
请求显示本地通知权限。
参数 | 类型 |
---|---|
options |
RequestPermissionOptions |
返回: any
自 1.0.0
dispatchEvent<T = void>(options: DispatchEventOptions) => any
向配置的运行器发送事件。
参数 | 类型 |
---|---|
options |
DispatchEventOptions |
返回: any
自 1.0.0
属性 | 类型 |
---|---|
geolocation |
PermissionState |
notifications |
PermissionState |
属性 | 类型 |
---|---|
apis |
{} |
属性 | 类型 | 描述 | 自 |
---|---|---|---|
标签 |
字符串 |
事件要发送到的运行器标签。 | 1.0.0 |
事件 |
字符串 |
已注册的事件监听器的名称。 | 1.0.0 |
详细信息 |
{ [key: string]: any; } |
'prompt' | 'prompt-with-rationale' | 'granted' | 'denied'
'geolocation' | 'notifications'
<!
获取有关设备的信息,如网络连接和电池状态。
属性 | 类型 | 描述 | 自 |
---|---|---|---|
getBatteryStatus |
() => BatteryStatus |
获取设备的当前电池状态。 | 1.0.0 |
getNetworkStatus |
() => NetworkStatus |
获取设备的当前网络状态。 | 1.0.0 |
属性 | 类型 |
---|---|
batteryLevel |
数字 |
isCharging |
布尔型 |
属性 | 类型 |
---|---|
connected |
布尔型 |
connectionType |
字符串 |
基于iOS的UserDefaults和Android的Shared Preferences的一个简单的字符串键/值存储。
属性 | 类型 | 描述 | 自 |
---|---|---|---|
set |
(key: string, value: string) => void |
使用给定键设置字符串值。 | 1.0.0 |
get |
(key: string) => { value: string; } |
获取给定键的字符串值。 | 1.0.0 |
remove |
(key: string) => void |
移除具有给定键的值。 | 1.0.0 |
发送基本本地通知。
属性 | 类型 | 描述 | 自 |
---|---|---|---|
schedule |
(options: {}) => void |
安排本地通知 | 1.0.0 |
属性 | 类型 | 描述 | 自 |
---|---|---|---|
id |
数字 |
通知标识符。在Android上它是一个32位整数值。因此,值应在 -2147483648 到 2147483647 之间。 | 1.0.0 |
title |
字符串 |
通知的标题。 | 1.0.0 |
body |
字符串 |
通知的主体,显示在标题下方。 | 1.0.0 |
scheduleAt |
Date |
发送此通知的日期。 | 1.0.0 |
sound |
字符串 |
在显示此通知时要播放的音频文件名称。包括文件扩展名。在iOS上,文件应位于应用程序捆绑包中。在Android上,文件应位于res/raw文件夹中。推荐格式为.wav ,因为iOS和Android都支持该格式。仅适用于iOS和Android < 26。对于Android 26+,使用配置了所需声音的通道的channelId。如果找不到声音文件(即空字符串或名称错误),则将使用默认系统通知声音。如果没有提供,则Android上将播放默认声音,iOS上则没有声音。 |
1.0.0 |
actionTypeId |
字符串 |
将动作类型与该通知相关联。 | 1.0.0 |
threadIdentifier |
字符串 |
用于对多个通知进行分组。在UNMutableNotificationContent 上设置threadIdentifier 。仅适用于iOS。 |
1.0.0 |
summaryArgument |
字符串 |
该通知添加到类别总结格式字符串的字符串。在UNMutableNotificationContent 上设置summaryArgument 。仅适用于iOS。 |
1.0.0 |
group |
字符串 |
用于对多个通知进行分组。使用提供的值调用NotificationCompat.Builder 上的setGroup() 。仅适用于Android。 |
1.0.0 |
groupSummary |
字符串 |
如果为true,则此通知成为一组通知的摘要。使用提供的值调用NotificationCompat.Builder 上的setGroupSummary() 。仅适用于Android中使用group 时。 |
1.0.0 |
extra |
任意 |
设置存储在此通知中的额外数据。 | 1.0.0 |
ongoing |
布尔型 |
如果为true,则无法滑动关闭通知。使用提供的值调用NotificationCompat.Builder 上的setOngoing() 。仅适用于Android。 |
1.0.0 |
autoCancel |
布尔型 |
如果为true,则当用户点击时取消通知。使用提供的值调用NotificationCompat.Builder 上的setAutoCancel() 。仅适用于Android。 |
1.0.0 |
largeBody |
字符串 |
为显示在大文本通知风格中设置多行文本块。 | 1.0.0 |
summaryText |
字符串 |
用于设置邮箱和大文本通知风格中的摘要文本详情。仅适用于Android。 | 1.0.0 |
smallIcon |
字符串 |
设置自定义状态栏图标。如果设置,则将覆盖Jigra配置中的smallIcon 选项。图标应放在您的应用程序的res/drawable 文件夹中。此选项的值应为可绘制资源ID,即无扩展名的文件名。仅适用于Android。 |
1.0.0 |
largeIcon |
字符串 |
为通知设置大型图标。图标应放在您的应用程序的res/drawable 文件夹中。此选项的值应为可绘制资源ID,即无扩展名的文件名。仅适用于Android。 |
1.0.0 |
channelId |
字符串 |
指定通知应投递的通道。如果不存在具有给定名称的通道,则不会触发通知。如果没有提供,则将使用默认通道。使用提供的值调用NotificationCompat.Builder 上的setChannelId() 。仅适用于Android 26+。 |
1.0.0 |
获取设备位置信息访问权限。
属性 | 类型 | 描述 | 自 |
---|---|---|---|
getCurrentPosition |
() => GetCurrentPositionResult |
获取设备的最后已知位置 | 1.0.0 |
属性 | 类型 | 描述 | 自 |
---|---|---|---|
latitude |
数字 |
纬度,十进制度数 | 1.0.0 |
longitude |
数字 |
经度,十进制度数 | 1.0.0 |
accuracy |
数字 |
纬度和经度坐标的精度级别,单位为米 | 1.0.0 |
altitude |
数字 | 空值 |
用户的海拔高度(如果可用) | 1.0.0 |
海拔精度 |
数字 | 空值 |
海拔坐标的精度级别(以米为单位),如果可用。在所有iOS版本以及Android 8.0+上可用。 | 1.0.0 |
速度 |
数字 | 空值 |
用户行进的速度(如果可用) | 1.0.0 |
航向 |
数字 | 空值 |
用户面向的航向(如果可用) | 1.0.0 |
与与此应用配对的智能手表进行交互
sendMessage、transferUserInfo和updateApplicationContext是WCSession代理方法的原生路由,但在JigraWatch智能手表应用程序中目前没有效果。如果开发了一个原始的智能手表应用程序作为Jigra应用程序的伴侣程序,则可以实现这些功能。
属性 | 类型 | 描述 |
---|---|---|
sendMessage |
(选项:[]) => void |
使用sendMessage() WCSession代理方法向智能手表发送消息。这对JigraWatch智能手表应用程序没有任何效果。 |
transferUserInfo |
(选项:[]) => void |
使用transferUserInfo() WCSession代理方法向智能手表发送信息。这对JigraWatch智能手表应用程序没有任何效果。 |
updateApplicationContext |
(选项:[]) => void |
使用updateApplicationContext() WCSession代理方法更新智能手表上的应用程序上下文。这对JigraWatch智能手表应用程序没有任何效果。 |
isReachable |
布尔型 |
检查辅助智能手表是否可达。 |
updateWatchUI |
(选项:{ watchUI: string; }) => void |
用此处指定的内容替换智能手表上的当前UI。 |
updateWatchData |
(选项:{ data: { [key: string]: string; }; }) => void |
更新智能手表用于在文本字段和按钮字段中显示变量的数据。 |