如何在Ionic Capacitor应用中仅在屏幕解锁时显示本地通知
在Ionic Capacitor中实现仅屏幕解锁时显示本地通知
由于@capacitor/local-notifications插件本身没有提供直接配置“仅解锁时显示通知”的选项,你需要结合原生平台的API来实现这个逻辑——核心思路是在触发通知前先判断设备的锁屏状态,仅当屏幕解锁时才发起通知请求。
Android 端实现
添加锁屏状态检查的原生方法
在Android项目的MainActivity或自定义插件类中,添加判断设备解锁状态的方法:import android.app.KeyguardManager; import android.content.Context; public boolean isDeviceUnlocked() { KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); return !keyguardManager.isDeviceLocked(); // 返回true表示设备已解锁 }在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 端实现
利用iOS原生API判断解锁状态
在iOS项目的AppDelegate或自定义插件中,通过系统属性判断设备是否解锁:import UIKit func isDeviceUnlocked() -> Bool { return UIApplication.shared.isProtectedDataAvailable }在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
相关产品推荐
相关产品推荐

