PKU harness

notify

NotifyReadiness 类型和 deliveryBlocker 函数,用于在界面上检查提醒和定时检查能否准时送达。

提醒和定时检查要准时送达,需要用户在系统里打开几项权限。这个模块提供的类型和函数可以帮插件界面查明缺了哪一项,并引导用户去打开。它们配合 services.notify.readiness()(读取当前状态)和 services.notify.fix(kind)(弹出系统请求或打开对应的系统设置页)使用。

源码:packages/sdk/src/notify.ts。

准时送达需要的条件

目前优先支持 Android。在 Android 上,准时送达需要满足以下条件:

  • 通知权限。
  • 「闹钟和提醒」特殊权限,也就是精确闹钟。Android 14 起这项权限默认是拒绝的。
  • 关闭系统对本应用的电池优化。这一项只是建议,不打开也不会阻止提醒按时触发。

类型与函数

type NotifyPermission = 'granted' | 'undetermined' | 'denied';

interface NotifyReadiness {
  /** 'denied' 表示系统不会再弹出请求,只能到系统设置里打开。 */
  notifications: NotifyPermission;
  /** 是否允许精确闹钟(系统没有这项权限时恒为 true)。 */
  exactAlarms: boolean;
  /** 系统可能推迟本应用的后台任务(电池优化已开启)。 */
  batteryOptimized: boolean;
}

/** 用户可以修复的项目:弹出系统请求,或打开对应的系统设置页。 */
type NotifyFixKind = 'notifications' | 'exactAlarms' | 'battery';

/**
 * 返回第一个导致提醒无法准时送达的原因;没有阻碍时返回 null。
 * 电池优化只是建议(精确闹钟照样会触发),所以它永远不会被当作阻碍。
 */
function deliveryBlocker(r: NotifyReadiness): 'notifications' | 'exactAlarms' | null;

示例:显示修复按钮

只有确实有东西阻碍送达时,界面才需要显示修复按钮。fix 只能在用户点击时调用:

import { deliveryBlocker, type NotifyReadiness, type PluginScreenProps } from '@pku-harness/sdk';
import { useEffect, useState } from 'react';

export function ReminderBanner({ host, services }: PluginScreenProps) {
  const { Button } = host.components;
  const [r, setR] = useState<NotifyReadiness | null>(null);
  useEffect(() => void services.notify.readiness().then(setR), [services]);
  const blocker = r && deliveryBlocker(r);
  if (!blocker) return null;
  return (
    <Button
      title={blocker === 'notifications' ? '允许通知' : '允许准时提醒'}
      variant="secondary"
      onPress={() => void services.notify.fix(blocker).then(setR)}
    />
  );
}

用户可能还没改任何设置就从系统设置页返回了,所以应用回到前台时,也要重新读取一次 readiness。

本页目录