Skip to content
v1
文档/iOS SDK/开发指南

监听和处理来电

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 状态调用 rejecthangup
  • SDK Snapshot 进入 Ended 后,宿主同步结束 CallKit 通话并停止铃声。
  • App 冷启动时 onCallReceived: 可能晚于 Push 回调,CallKit handler 应等待 currentCallSession 恢复,不要自行构造 Session。