You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:51:24