CapacitorBackgroundRunner 1.0.5

CapacitorBackgroundRunner 1.0.5

Dan Giralte (Ionic) 维护。.



  • Ionic 团队

@capacitor/background-runner

Background Runner 提供了一个基于事件的独立 JavaScript 环境,用于在网页视图之外执行您的 JavaScript 代码。

安装

npm install @capacitor/background-runner
npx cap sync

Background Runner 支持 various device APIs,在使用之前必须获得用户授权。

iOS

在 iOS 上,您必须启用 Background Modes 功能。

Enable Background Mode Capability in Xcode

添加该功能后,至少要启用 Background fetchBackground processing 模式,以启用注册和安排后台任务的能力。

如果将使用地理位置或推送通知,分别启用 Location updatesRemote notifications

Configure Background Modes in Xcode

启用 Background Modes 功能后,将以下内容添加到您的应用的 AppDelegate.swift

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

地理位置

该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" />

前两个权限请求获取精确定位和粗略定位的位置数据,最后一行是可选的,但如果有必要使App运行需要GPS,则必须添加。您可以省略这一行,但请注意,这可能意味着您的App安装在缺少GPS硬件的设备上。

本地通知

Android 13需要权限检查才能发送通知。您必须相应地调用checkPermissions()requestPermissions()

在Android 12及以下版本中,不会弹出提示,而是直接返回授权。

从Android 12开始,除非在您的AndroidManifest.xml中添加此权限,否则计划中的通知不会精确。

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />

请注意,即使有权限,用户仍然可以在应用设置中禁用精确通知。

阅读有关 设置权限 的内容,了解更多关于设置 Android 权限的信息,请参阅 Android指南

使用后台运行器

后台运行器是一个基于事件的 JavaScript 环境,它会向你在 capacitor.config.ts 文件中指定的 JavaScript 运行器文件中发出事件。如果运行器发现与进来事件对应的处理程序,它将执行事件处理程序,一旦调用(或如果操作系统强制终止你的进程)resolve()reject(),它将关闭。

示例运行器 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();
  }
});

在运行器调用的每个事件处理程序内调用 resolve()reject()必需的。如果不能这样做,如果事件在应用处于后台时被调用,操作系统可能会终止你的运行器。如果应用处于前台,异步调用 dispatchEvent 可能无法解析。

配置后台运行器

后台运行器在加载时会自动注册一个后台任务,一旦应用被放到后台,它就会被安排运行。此行为的设置定义在您的 capacitor.config.ts 文件中

const config: CapacitorConfig = {
  plugins: {
    BackgroundRunner: {
      label: 'com.example.background.task',
      src: 'background.js',
      event: 'myCustomEvent',
      repeat: true,
      interval: 2,
      autoStart: false,
    },
  },
};

JavaScript API

Background Runner 在浏览器或web视图中不会执行您的JavaScript代码,因此您可能熟悉的典型Web API可能不可用。这包括DOM API以及与应用程序DOM交互的能力。

以下是在Background Runner中提供的可用Web API列表

除了标准Web API之外,Background Runner还支持一系列自定义Capacitor API,暴露了相关的移动设备功能。

Runner生命周期

目前,运行器是为了在您的应用处于后台时执行周期性工作而设计的,或者在应用处于前台时在独立的线程上执行异步工作。因此,运行器的生命周期并不长。运行器事件之间的状态不会被维持。每次调用 dispatchEvent() 都会在一个新的上下文中加载和执行您的运行器代码,一旦调用 resolve()reject(),上下文就会被销毁。

Android电池优化

某些Android厂商提供超出标准Android提供的内置电池优化设置。这些优化中的一些必须由您的最终用户禁用,才能使后台任务正常工作。

访问不要杀死我的应用!获取有关受影响制造商和用户调整设置的步骤的更多信息。

后台任务限制

在移动操作系统上无法运行持久的、始终运行的后台服务。由于iOS和Android为减少电池和数据处理所强加的限制,后台任务在设计实现时必须牢记其受到的各种限制。

iOS

  • 您的任务调用每次运行大约30秒,在此之后您必须调用completed()或任务将被终止。
  • 虽然您可以设置一个间隔定义任务在应用处于后台时运行的时间,或者运行频率,但这不是保证的。iOS将决定任务最终何时以及多久运行一次,部分取决于您应用的使用频率。

Android

  • 您的任务最长有10分钟的执行时间,但为了保持跨平台兼容性,您应将工作限制在最多30秒。
  • 重复后台任务的最小间隔为至少15分钟。类似于iOS,您请求的任何间隔可能都不会完全命中 - 实际执行时间取决于操作系统电池优化和其他启发式算法。

API

checkPermissions()

checkPermissions() => any

检查各种 Capacitor 设备 API 的权限。

返回值: 任意类型

自从 1.0.0


requestPermissions(...)

requestPermissions(options: RequestPermissionOptions) => any

请求显示本地通知的权限。

参数 类型
options RequestPermissionOptions

返回值: 任意类型

自从 1.0.0


dispatchEvent(...)

dispatchEvent(options: DispatchEventOptions) => any

向配置的运行器发送事件。

参数 类型
options DispatchEventOptions

返回值: 任意类型

自从 1.0.0


接口

权限状态

属性 类型
geolocation 权限状态
通知 权限状态

请求权限选项

属性 类型
接口 {}

派发事件选项

属性 类型 描述 自从
标签 字符串 发送事件的运行时标签 1.0.0
事件 字符串 已注册的事件监听器名称。 1.0.0
详细信息 { [键: string]: any; }

类型别名

权限状态

'prompt' | 'prompt-with-rationale' | 'granted' | 'denied'

API

'地理位置' | '通知'

Capacitor API

接口

CapacitorDevice

获取设备信息,例如网络连接和电池状态。

属性 类型 描述 自从
getBatteryStatus () => BatteryStatus 获取设备当前电池状态。 1.0.0
getNetworkStatus () => NetworkStatus 获取设备当前网络状态。 1.0.0

BatteryStatus

属性 类型
batteryLevel 数字型
isCharging 布尔型

网络状态

属性 类型
连接中 布尔型
连接类型 字符串

CapacitorKV

一个简单的字符串键/值存储,在iOS上由UserDefaults提供支持,在Android上由Shared Preferences提供支持。

属性 类型 描述 自从
设置 (键:字符串,值:字符串) => void 使用指定的键设置字符串值。 1.0.0
获取 (键:字符串) => 字符串 获取指定键的字符串值。 1.0.0
删除 (键:字符串) => void 删除指定键的值。 1.0.0

CapacitorNotifications

发送基本的本地通知。

属性 类型 描述 自从
计划 (选项:{}) => void 安排一个本地通知 1.0.0

NotificationScheduleOptions

属性 类型 描述 自从
id 数字型 通知标识符。在Android上是32位整型。因此,值应在-2147483648和2147483647之间。 1.0.0
标题 字符串 通知的标题。 1.0.0
正文 字符串 通知的正文,显示在标题下方。 1.0.0
安排在 日期 发送此通知的日期。 1.0.0
声音 字符串 播放此通知显示时音频文件的名称。请包括文件扩展名。在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()。仅适用于使用group的Android。 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 字符串 设置自定义状态栏图标。如果设置,它将覆盖从Capacitor配置中设置的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

CapacitorGeolocation

获取设备地理位置信息。

属性 类型 描述 自从
getCurrentLocation () => GetCurrentPositionResult 获取设备最后已知位置 1.0.0

GetCurrentPositionResult

属性 类型 描述 自从
纬度 数字型 以十进制度数表示的纬度 1.0.0
经度 数字型 以十进制度数表示的经度 1.0.0
精度 数字型 纬度和经度坐标的精度级别,以米为单位 1.0.0
海拔 数字 | null 用户所在的海拔(如果可用) 1.0.0
海拔精度 数字 | null 如果可用,海拔坐标的精度级别,以米为单位。在所有iOS版本和Android 8.0+上可用。 1.0.0
速度 数字 | null 用户正在移动的速度(如果可用) 1.0.0
航向 数字 | null 用户所面临的航向(如果可用) 1.0.0