Swift调用MCNearbyServiceAdvertiser报-72008服务发布失败错误
问题描述
在Swift项目中使用Multipeer Connectivity框架实现多点连接功能,调用MCNearbyServiceAdvertiser实现设备广播时,即使已经在Info.plist中添加了对应权限配置,运行仍然抛出如下错误:
[MCNearbyServiceAdvertiser] Server did not publish: errorDict [{ NSNetServicesErrorCode = "-72008"; NSNetServicesErrorDomain = 10; }].
涉及的核心实现代码如下:
import UIKit import MultipeerConnectivity class TestMutilpeer: NSObject { var SERVICE_NAME = "probonjore-tcp" var ACK_SERVICE_NAME = "abc-txtchat" var peer: MCPeerID! var session: MCSession! var serviceAdvertiser: MCNearbyServiceAdvertiser! override init() { super.init() let peer = MCPeerID(displayName: UIDevice.current.name) session = MCSession(peer: peer) let serviceAdvertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: nil, serviceType: ACK_SERVICE_NAME) serviceAdvertiser.startAdvertisingPeer() } }
错误原因
错误码-72008属于Bonjour服务发布失败错误,结合给出的代码,核心诱因有三类:
- 对象提前被释放:
init方法中创建的peer、serviceAdvertiser都是局部常量,没有赋值给类的同名属性,init执行完成后局部变量会被ARC自动回收,导致广播服务刚启动就被销毁,发布失败。 - Bonjour权限配置不完整:iOS 14以上系统除了需要配置本地网络使用权限描述,还必须在
NSBonjourServices清单中明确声明应用用到的Bonjour服务标识,格式错误或漏写都会导致系统拦截服务发布。 - 参数或环境不符合规范:
serviceType命名不符合Bonjour协议要求、测试环境存在VPN/防火墙/公共网络拦截,也会触发该错误。
修复方案
按照以下优先级逐一排查修复:
- 修复内存管理问题
修改init方法逻辑,将创建的对象赋值给类属性,同时设置必要的代理,避免对象被提前回收。修正后的初始化代码参考:
同时让override init() { super.init() // 直接给类属性赋值,不要创建同名局部变量 peer = MCPeerID(displayName: UIDevice.current.name) session = MCSession(peer: peer, securityIdentity: nil, encryptionPreference: .required) session.delegate = self serviceAdvertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: nil, serviceType: ACK_SERVICE_NAME) serviceAdvertiser.delegate = self serviceAdvertiser.startAdvertisingPeer() }TestMutilpeer类遵守MCSessionDelegate、MCNearbyServiceAdvertiserDelegate协议,实现对应的必选代理方法。 - 补全Info.plist配置
打开Info.plist检查两项配置:- 确保
NSLocalNetworkUsageDescription字段填写了清晰的权限申请文案,说明应用需要本地网络权限发现附近设备 - 在
NSBonjourServices数组中添加完整的服务标识,格式为_<你的serviceType>._tcp,对应代码中的abc-txtchat,需要添加_abc-txtchat._tcp,注意不能漏写前置下划线和._tcp后缀
- 确保
- 校验参数与测试环境
- 确认
serviceType符合命名规范:长度1-15字符,仅包含小写字母、数字、连字符,不能以连字符开头/结尾,不能包含大写字母、下划线或其他特殊符号 - 测试时关闭设备上的VPN、网络代理工具,确保设备连接到支持Bonjour广播的局域网(避免使用企业、公共场合的受限网络)
- 如果使用模拟器测试,检查Mac防火墙设置,不要阻止应用的传入连接,确保Mac和真机处于同一局域网下。
- 确认
内容的提问来源于stack exchange,提问作者quan
相关产品推荐
相关产品推荐

