You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ionic V4(Angular)视频通话常驻通知图标实现方案咨询

实现Ionic V4视频通话常驻通知栏图标方案

我来帮你搞定这个需求!你看到Waze那种常驻通知栏的图标,本质是利用了系统的「前台服务」(Android)或者「CallKit框架」(iOS),普通的推送通知因为可以被用户手动清除,所以达不到这种效果。下面分平台给你具体的实现步骤:

Android 端:前台服务实现常驻通知

Android系统中,普通通知可以被用户手动清除,但前台服务绑定的通知是系统级的,无法手动清除,只有当服务停止时才会消失,这正是Waze导航时用的方案。

步骤1:安装前台服务插件

在你的Ionic项目中安装Cordova前台服务插件:

ionic cordova plugin add cordova-plugin-foreground-service
npm install @ionic-native/foreground-service

步骤2:启动/停止前台服务

在你的通话组件中,导入插件并实现启动和停止逻辑:

import { ForegroundService } from '@ionic-native/foreground-service/ngx';

constructor(private foregroundService: ForegroundService) {}

// 视频通话开始时调用
startCallForegroundNotification() {
  // 先创建通知渠道(Android 8.0+必须)
  this.foregroundService.createNotificationChannel({
    id: 'video_call_channel',
    name: '视频通话通知',
    description: '显示当前视频通话状态',
    importance: 2 // 确保通知显示在顶部
  });

  // 启动前台服务并显示通知
  this.foregroundService.start({
    id: 1001,
    title: '视频通话中',
    text: '正在进行视频通话',
    icon: 'res://icon', // 使用你的应用图标,也可以自定义通知图标
    channelId: 'video_call_channel',
    ongoing: true // 标记为持续通知,无法手动清除
  });
}

// 视频通话结束时调用
stopCallForegroundNotification() {
  this.foregroundService.stop();
}

这样一来,当用户进入视频通话,前台服务启动,通知栏会显示常驻图标;通话结束后停止服务,通知才会消失,用户无法手动清除这个通知。

iOS 端:CallKit实现系统级通话状态

iOS没有前台服务的概念,但对于VoIP(包括视频通话),苹果提供了CallKit框架,它会让系统在状态栏显示原生通话状态的图标,即使APP在后台或被挂起,这个状态是系统管理的,用户无法手动清除。

步骤1:安装CallKit插件

在项目中安装Cordova CallKit插件:

ionic cordova plugin add cordova-plugin-callkit
npm install @ionic-native/callkit

步骤2:初始化CallKit会话

在通话组件中实现CallKit的启动和结束逻辑:

import { CallKit } from '@ionic-native/callkit/ngx';

constructor(private callKit: CallKit) {}

// 视频通话开始时调用
startCallKitSession(callId: string, callerName: string) {
  this.callKit.startCall({
    id: callId, // 唯一标识通话
    name: callerName,
    handle: callerName,
    hasVideo: true // 标记为视频通话
  }).then(() => {
    console.log('CallKit会话已启动,状态栏将显示通话图标');
  }).catch(err => {
    console.error('启动CallKit失败:', err);
  });
}

// 视频通话结束时调用
endCallKitSession(callId: string) {
  this.callKit.endCall(callId).then(() => {
    console.log('CallKit会话已结束');
  }).catch(err => {
    console.error('结束CallKit失败:', err);
  });
}

注意事项

  • 需要在iOS的Info.plist中添加VoIP后台模式:打开platforms/ios/你的项目名/Info.plist,添加UIBackgroundModes数组,包含voip项。
  • CallKit会让系统把你的通话识别为原生通话,除了状态栏图标,还能支持系统的通话控制(比如锁屏时的接听/挂断按钮),体验更原生。

替代方案:Android持久通知(不如前台服务可靠)

如果你暂时不想用前台服务,也可以用你现有的Notifications插件创建持续通知(标记ongoing: true),但这种方式在部分定制ROM中可能被允许清除,不如前台服务稳定:

import { Plugins } from '@capacitor/core';
const { Notifications } = Plugins;

// 启动持续通知
async startPersistentNotification() {
  await Notifications.createChannel({
    id: 'video_call',
    name: '视频通话',
    importance: 3,
    description: '视频通话状态通知'
  });

  await Notifications.schedule({
    notifications: [
      {
        title: '视频通话中',
        body: '正在进行视频通话',
        id: 1,
        ongoing: true, // 关键:持续通知
        icon: 'res://icon',
        channelId: 'video_call'
      }
    ]
  });
}

// 结束通话时清除
async stopPersistentNotification() {
  await Notifications.cancel({ id: 1 });
}

总结

  • Android用前台服务是最标准、最可靠的方案,符合系统对持续任务的要求;
  • iOS用CallKit是官方推荐的VoIP通话状态管理方式,能获得原生的状态栏显示效果。

这样就能实现你想要的:用户离开APP后,通知栏依然显示通话状态的常驻图标,且无法手动清除,和Waze的效果一致。

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

火山引擎 最新活动