常见问题
更新时间: 2024/08/23 10:16:57
- 接收邀请后没有收到 onInvited 回调
- 音视频通话过程中播放 IM 的音频消息,播放完成之后,音视频通话的麦克风和音频播放失效
- 如何实现呼叫页面和呼叫铃声的 UI界面
- 如何自定义 AVAudioSession 设置
- 为什么对端挂断后,本端不会自动挂断?
- 呼叫组件挂断后,会自动销毁NERTC实例吗?
- V2版本呼叫组件 NEHangupReasonCode 说明
- 初始化呼叫组件时,偶现应用卡死
接收邀请后没有收到 onInvited 回调
问题原因:
- 实现
NERtcCallKitDelegate
的方法不正确。 onInvited
回调被加在某个页面,当页面生命周期结束时,删除了NERtcCallKitDelegate
协议。- 主叫端的 SDK 版本太低,例如主叫端是 V1.3.x 版本的 Web 端。
- 群组呼叫导致收不到
onInvited
回调。
排查思路:
- 确认主叫的呼叫方法中,传入的 accid 是否正确。
- 确认被叫是否有收到呼叫信令。
- 确认主叫和被叫的 SDK 版本。
- 确认 iOS 端在实现
NERtcCallKitDelegate
时,按正确的方法添加了onInvited
回调。
解决方案:
- 实现
NERtcCallKitDelegate
时,请先添加[NERtcCallKit.sharedInstance addDelegate:self]
,再添加onInvited
回调。 - 请将实现
NERtcCallKitDelegate
写在全局单例类里面,场景上也是任何时候都可以收到邀请回调。 - 升级 SDK 的版本,Web 端的 NERtcCallKit SDK 版本请升级至 V1.4.2 及以上版本。
- 如果是群组呼叫导致收不到
onInvited
回调,请升级 iOS 端的 NERtcCallKit SDK 版本至 V1.5.1 及以上版本,Web 端的 NERtcCallKit SDK 版本请升级至 V1.4.2 及以上版本。
音视频通话过程中播放 IM 的音频消息,播放完成之后,音视频通话的麦克风和音频播放失效
问题原因:
IM 在播放音频消息和录音时,会修改 audioSession
的配置,影响了音视频通话中的相关功能。
解决方案:
在初始化 IM SDK之前,增加如下单例类配置,禁止 IM 在播放音频消息和录音时修改 audioSession
的配置。
/**
* 禁止在IM 录制、播放音频时设置AVAudioSession, 防止影响其他音视频效果
* @param disabled YES则禁止重置
*/
- (void)disableResetAudioSession:(BOOL)disabled;
如何实现呼叫页面和呼叫铃声的 UI 界面
请参考即时通讯示例项目源码中, NECallViewController
页面的实现方法。
即时通讯 Demo 使用 NIMKit + NERtcCallKit 的组合。其中包含了呼叫的 UI 界面,包括呼叫状态管理、远端视图、本地视图、呼叫铃声等逻辑。
如何自定义 AVAudioSession 设置
问题描述:
在呼叫、接收呼叫、响铃提醒、播放铃声播放等场景中,App 想要自己管理 AVAudioSession
中的设置,例如修改为听筒模式或扬声器模式,并且在加入房间之后,需要延续对 AVAudioSession
的设置,该如何实现?
解决方案:
在默认情况下,NERtcCallKit SDK 和 App 对 AVAudioSession
都有控制权。
您可以在加入房间之前, 调用如下方法限制 NERtcCallKit SDK 对 AVAudioSession
的操作权限,而使用其他应用或第三方组件对 AVAudioSession
进行操控。
[[NERtcEngine sharedEngine] setAudioSessionOperationRestriction:kNERtcAudioSessionOperationRestrictionAll];
一旦调用该方法限制了 NERtcCallKit SDK 对 AVAudioSession
的控制权限, NERtcCallKit SDK 将无法对 AVAudioSession
进行相关设置,需要 App 或第三方组件来维护相关的设置。
为什么对端挂断后,本端不会自动挂断?
问题描述:
在一对一通话中,对端挂断后,本端没有挂断。
问题原因:
iOS 端的呼叫组件暂时不提供 UI 界面,因此 NERtcCallKit 在收到对端挂断的通知之后不会自动处理挂断操作。
解决方案:
建议在收到对端挂断的回调之后,您在业务层可以主动调用 hangup
方法进行挂断操作,并且隐藏掉通话页面。
呼叫组件挂断后,会自动销毁NERTC实例吗?
默认不销毁 NERTC 实例。您可以在初始化呼叫组件时,通过 globalInit
参数设置 NERTC 是否随呼叫组件进行初始化和销毁,默认为 YES。
当 globalInit
参数设置为 NO ,呼叫组件发起呼叫或被叫收到来电时,会自动初始化NERTC 实例,呼叫组件挂断时,销毁NERTC 实例。具体配置如下:
如果是 V2.0 及之后版本,请通过 initRtcMode
参数设置 NERTC 是否随呼叫组件进行初始化和销毁。
- 示例代码(V2.0 API)
NECallEngine *engine = [NECallEngine sharedInstance];
NESetupConfig *config = [[NESetupConfig alloc] initWithAppkey:@"your app key"];
...
config.initRtcMode = InitRtcInNeed;
...
[engine setup:config];
- 示例代码(V1.0 API)
NERtcCallOptions *option = [NERtcCallOptions new];
...
option.globalInit = YES;
...
NERtcCallKit *callkit = [NERtcCallKit sharedInstance];
[callkit setupAppKey:@"your appkey" options:option];
V2版本呼叫组件 NEHangupReasonCode 说明
通过调用音视频通话的服务端 API 删除呼叫组件音视频房间或者踢出某个房间里面的用户时,被踢的用户组件层面会触发 onCallEnd
的回调,回调返回的通话终止的错误码是 10,SELF_RTC_DISCONNECTED
。被踢的另一端可能收到的错误码是 19,也有可能是10。这是因为被踢的人触发 onCallEnd:10
的同时,会通过信令发送给对方被踢了的事件,对方收到了就会回调错误码10,但是对端的用户 RTC SDK也会回调 onUserLeave
的回调,这个时候对端就会回调 onCallEnd:19
的错误码。所以 RTC 回调更快,另一端回调是19。如果是信令回调更快,则对端回调10,建议是两个错误都做对应的提示处理。
例如,用户A和用户B通话,用户A被服务端API接口踢出了通话,那么用户A会触发 onCallEnd
,错误码为10,用户B会也触发 onCallEnd
,错误码可能是10或者19。
IM层面被踢的情况下,回调的错误码是 8,KICKED
。
- V1版本的被踢,直接通过
onDisconnect
回调监听,建议升级到V2的呼叫组件版本。 - V1版本自己挂断不会触发
onCallEnd
接口,V2版本自己挂断会触发onCallEnd
,在onCallEnd
的错误码里面说明具体挂断的原因。
初始化呼叫组件时,偶现应用卡死
问题描述:
初始化 NERtcCallKit 的时候,应用偶现卡死。
问题原因:
呼叫组件初始化时,未在 Podfile
中指定 NERtc SDK 的版本号,IM SDK 和旧版本的 NERtc SDK 互锁,导致应用卡死。
解决方案:
请在 Podfile
中指定呼叫组件适配的 NERtcSDK 版本,命令如下:
pod 'NERtcCallKit', '~> 1.5.1'
pod 'NERtcSDK', '4.2.120'
呼叫组件中 IM 和 RTC 适配的版本请参见呼叫组件更新日志。