如何在Ionic 4+OpenTok应用中实现视频来电通知及来电页面?
这个问题我之前帮几个开发者处理过,核心痛点在于:应用处于后台或关闭状态时,handleNotificationReceived() 根本没法触发——因为这时候应用进程都没启动。得换个思路,从推送通知的系统触发逻辑、应用启动事件监听,再结合平台专属能力入手,才能实现类似FaceTime的来电体验。
1. 先理清OneSignal的通知触发逻辑
handleNotificationReceived() 仅在应用前台运行时生效。当应用后台或关闭时,系统会直接接管通知展示,这时候得靠 notificationOpened 事件来处理——不管应用是从关闭状态被唤醒,还是从后台切回前台,这个事件都会在应用启动/恢复时触发。
2. 配置OneSignal的通知负载
发送通知时,必须同时包含通知内容和数据负载,数据里要带上OpenTok通话必需的关键参数(比如会话ID、token、来电者信息等)。示例负载结构如下:
{ "app_id": "你的OneSignal应用ID", "contents": {"en": "有新的视频通话请求"}, "data": { "type": "incoming_call", "sessionId": "你的OpenTok会话ID", "token": "你的OpenTok通话Token", "callerName": "张三" }, "include_player_ids": ["目标用户的PlayerID"] }
这里的type字段用来标记这是来电通知,方便后续快速判断。
3. 在应用启动时监听通知打开事件
在app.component.ts的初始化方法里,添加notificationOpened的监听逻辑,这是处理后台/关闭状态来电的核心:
import { OneSignal } from '@ionic-native/onesignal/ngx'; import { Router } from '@angular/router'; import { Platform } from '@ionic/angular'; constructor( private platform: Platform, private oneSignal: OneSignal, private router: Router ) {} initializeApp() { this.platform.ready().then(() => { // 初始化OneSignal this.oneSignal.startInit('你的OneSignal应用ID'); // 监听通知打开事件(应用关闭/后台点击通知都会触发) this.oneSignal.handleNotificationOpened().subscribe(jsonData => { const notificationData = jsonData.notification.payload.additionalData; // 判断是否是来电通知 if (notificationData && notificationData.type === 'incoming_call') { // 直接导航到来电页面,传递通话参数 this.router.navigate(['/incoming-call'], { queryParams: { sessionId: notificationData.sessionId, token: notificationData.token, callerName: notificationData.callerName } }); } }); this.oneSignal.endInit(); }); }
这样一来,不管用户是在应用关闭时点击通知,还是后台点击,应用启动后都会直接跳转到来电页面,并带上OpenTok所需的参数。
4. 实现FaceTime风格的来电页面
这个页面需要满足几个核心需求:
- 全屏显示,禁用系统返回按钮(Android),模拟系统来电的沉浸感
- 展示来电者头像、姓名等信息
- 提供“接听”“拒绝”按钮:
- 接听时直接初始化OpenTok会话,跳转到视频通话页面
- 拒绝时发送通知给来电者,告知通话被拒绝
- 添加震动、铃声效果(可以用
@ionic-native/vibration和@ionic-native/native-audio插件实现)
5. 平台专属增强(提升体验的关键)
iOS:集成CallKit
普通推送在iOS后台可能被系统延迟,而且没法在锁屏界面显示类似FaceTime的来电弹窗。这时候需要集成CallKit框架:
- 收到来电通知时,通过CallKit发起系统级来电请求,锁屏/后台都会显示和系统电话一致的来电界面
- 接听时自动唤醒应用,初始化OpenTok会话
- 注意提前申请CallKit权限,避免和OneSignal通知重复展示
Android:使用前台服务
Android后台时应用可能被系统杀死,需要启动前台服务保持通话状态,同时用MediaStyle通知模拟系统来电样式,让接听/拒绝按钮直接显示在状态栏上,提升操作便捷性。
6. 测试注意事项
- 必须用真实设备测试后台/关闭状态的通知(模拟器无法完全模拟系统推送逻辑)
- iOS要确保推送权限已开启,OneSignal的证书配置正确
- Android要在
AndroidManifest.xml中配置必要权限(比如POST_NOTIFICATIONS、WAKE_LOCK等)
内容的提问来源于stack exchange,提问作者rami bin tahin

