监听和处理来电
Call 监听应由应用级对象长期注册,以便聊天页未打开时仍能接收来电。监听器使用弱引用,局部变量注册后会被释放。
注册监听
objc
[[BIMManager sharedInstance] addCallListener:self];swift
BIMManager.sharedInstance().addCallListener(listener: self)监听器使用弱引用保存,页面销毁时建议显式移除:
objc
[[BIMManager sharedInstance] removeCallListener:self];接听或拒绝
objc
- (void)onCallReceived:(BIMCallSession *)session {
self.callSession = session;
// 先展示来电页,用户点击“接听”后再调用 accept。
}
- (void)acceptCurrentCall {
[self.callSession acceptWithSucc:nil fail:^(int code, NSString *desc) {
NSLog(@"accept failed: %d %@", code, desc);
}];
}
- (void)rejectCurrentCall {
[self.callSession rejectWithSucc:nil fail:nil];
}swift
func onCallReceived(session: BIMCallSession) {
callSession = session
session.accept(succ: nil, fail: nil)
}只有 IncomingRinging 状态可以调用接听或拒绝。SDK 同一账号只维护一个活跃通话;已有通话时,新来电会在内部回复忙线。
onCallReceived: 返回前,[BIMManager sharedInstance].currentCallSession 已经指向同一个 Session。宿主应立即停止重复通知并展示来电信息,但不要自动接听。
转交 VoIP Push
宿主负责注册 PushKit,并将 payload 转交给 SDK:
objc
[[BIMManager sharedInstance]
handleIncomingVoIPPushPayload:payload.dictionaryPayload
completion:^{
completion();
}];swift
BIMManager.sharedInstance().handleIncomingVoIPPush(
payload: payload.dictionaryPayload,
completion: completion
)SDK 会查询通话详情并恢复来电 Session,不会接管宿主的 PKPushRegistryDelegate 或 CallKit UI。
Push completion 应在 SDK completion 中调用,让 SDK 有机会查询最新详情。payload 可以包含常见的 meetingId 字段,也兼容嵌套信封中的 to.participantId。
CallKit 协调建议
- 收到 Push 后先上报 CallKit,再把 payload 转交 SDK,并用业务映射保存 CallKit UUID 与
callID。 - 用户在 CallKit 接听时,对当前 Session 调用
acceptWithSucc:fail:;只有成功后才 fulfill 接听 action。 - 用户从 CallKit 拒绝或结束时,根据 Snapshot 状态调用
reject或hangup。 - SDK Snapshot 进入
Ended后,宿主同步结束 CallKit 通话并停止铃声。 - App 冷启动时
onCallReceived:可能晚于 Push 回调,CallKit handler 应等待currentCallSession恢复,不要自行构造 Session。
