iOS Swift使用WebRTC设置RTCPeerConnection Answer时触发EXC_BAD_ACCESS崩溃求助
问题描述
我使用Swift结合Google WebRTC Pod开发iOS原生WebRTC应用,通过自定义WebSocket连接OpenVidu服务器传输RTC视频通话所需信息。但在为Peer Connection设置Answer会话描述时,应用触发EXC_BAD_ACCESS信号崩溃。
创建并设置Offer的代码:
func createOfferForPublishing(constraints:RTCMediaConstraints){ localParticipant?.peerConnection?.offer(for: constraints, completionHandler: { sdp, error in if let error = error { print(error) return } self.localParticipant?.peerConnection?.setLocalDescription(sdp!, completionHandler: { error in if let error=error{ print(error) return } self.openViduSocket?.publishVideo(sessionDescription: sdp!) }) }) }
Offer通过Socket发送后,收到包含Answer的JSON响应,执行以下代码时崩溃:
if let connection = session.localParticipant?.peerConnection{ let remoteSdpAnswer = RTCSessionDescription(type: .answer, sdp: params.sdpAnswer) connection.setRemoteDescription(remoteSdpAnswer) }
已知相关修复:RTCSessionDescription初始化器遇到无效SDP字符串应返回nil,但当前使用的版本未生效,仍会返回正常实例。
疑问:
- 有没有办法在Swift中绕过该崩溃?
- 通过手动下载SDK替换框架能否修复该崩溃?
解决方案
1. Swift中绕过崩溃的临时方案
- 提前校验SDP格式:在创建
RTCSessionDescription前,对params.sdpAnswer做基础格式校验,比如检查是否包含v=0、o=等SDP必备字段,排除空字符串或明显不符合格式的内容,避免传入无效SDP。 - 捕获底层异常:借助Objective-C的异常捕获机制,包裹
RTCSessionDescription的初始化代码,避免无效SDP触发的崩溃:
import ObjectiveC if let connection = session.localParticipant?.peerConnection, let sdpStr = params.sdpAnswer { var remoteSdp: RTCSessionDescription? objc_exception_tryCatch({ remoteSdp = RTCSessionDescription(type: .answer, sdp: sdpStr) }, nil, nil) if let validSdp = remoteSdp { connection.setRemoteDescription(validSdp) } else { print("无效的SDP Answer,跳过设置") } }
- 校验对象生命周期:确认
localParticipant和peerConnection的生命周期正常,避免因对象提前释放导致的野指针访问,必要时在闭包中使用[weak self]避免循环引用。
2. 手动替换SDK的可行性
可以尝试,且大概率能修复问题:
- 前往WebRTC官方仓库下载最新稳定版预编译框架,替换当前CocoaPods引入的版本。你提到的初始化器返回nil的修复已合并到主线,新版本框架会从根源上避免无效SDP导致的崩溃。
- 替换后需验证项目依赖兼容性,确保其他组件与新WebRTC版本的API匹配,避免出现符号缺失或调用错误。
内容的提问来源于stack exchange,提问作者Mark R
相关产品推荐
相关产品推荐

