You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ionic Capacitor应用中仅在屏幕解锁时显示本地通知

在Ionic Capacitor中实现仅屏幕解锁时显示本地通知

由于@capacitor/local-notifications插件本身没有提供直接配置“仅解锁时显示通知”的选项,你需要结合原生平台的API来实现这个逻辑——核心思路是在触发通知前先判断设备的锁屏状态,仅当屏幕解锁时才发起通知请求。

Android 端实现

  1. 添加锁屏状态检查的原生方法
    在Android项目的MainActivity或自定义插件类中,添加判断设备解锁状态的方法:

    import android.app.KeyguardManager;
    import android.content.Context;
    
    public boolean isDeviceUnlocked() {
        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        return !keyguardManager.isDeviceLocked(); // 返回true表示设备已解锁
    }
    
  2. 在Ionic中调用原生方法并触发通知
    通过Capacitor的自定义插件或原生API调用检查方法,再决定是否发送通知:

    import { LocalNotifications } from '@capacitor/local-notifications';
    import { Plugins } from '@capacitor/core';
    
    const { DeviceLockChecker } = Plugins; // 假设你封装了自定义检查插件
    
    async function scheduleNotificationOnlyWhenUnlocked() {
        const isUnlocked = await DeviceLockChecker.isDeviceUnlocked();
        if (isUnlocked) {
            await LocalNotifications.schedule({
                notifications: [
                    {
                        title: "仅解锁时显示",
                        body: "设备已解锁,展示这条通知",
                        id: 1,
                        schedule: { at: new Date(Date.now() + 1000) }
                    }
                ]
            });
        }
    }
    

iOS 端实现

  1. 利用iOS原生API判断解锁状态
    在iOS项目的AppDelegate或自定义插件中,通过系统属性判断设备是否解锁:

    import UIKit
    
    func isDeviceUnlocked() -> Bool {
        return UIApplication.shared.isProtectedDataAvailable
    }
    
  2. 在Ionic中调用并触发通知
    同样先检查解锁状态,再执行通知调度:

    async function scheduleNotificationOnlyWhenUnlocked() {
        const isUnlocked = await DeviceLockChecker.isDeviceUnlocked();
        if (isUnlocked) {
            await LocalNotifications.schedule({
                notifications: [
                    {
                        title: "仅解锁时显示",
                        body: "设备已解锁,展示这条通知",
                        id: 1,
                        schedule: { at: new Date(Date.now() + 1000) }
                    }
                ]
            });
        }
    }
    

替代方案:修改原生插件代码

如果不想封装自定义插件,可以直接修改@capacitor/local-notifications的原生代码:

  • Android:在LocalNotificationsPlugin.java的schedule方法中,加入锁屏状态检查逻辑,仅解锁时执行通知调度。
  • iOS:在LocalNotifications.swift的schedule方法中,先判断isProtectedDataAvailable,再决定是否发送通知。

注意:修改插件原生代码后,需要维护自己的分支,避免后续插件更新覆盖你的修改。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:25:20