邀请停止广告的对等方时,多对等体连接崩溃



我有以下情况:

  • 对等 A 正在自定义 UI 中等待邀请(我们称之为 WaitingVC )。MCNearbyServiceAdvertiser对象在应用程序启动时初始化,播发在呈现WaitingVC时启动(startAdvertisingPeer)。
  • 对等 B 已启动并运行MCNearbyServiceBrowser,也具有自定义 UI(即不使用 Apple 提供的 MCBrowserViewController)。
  • 对等方 B 找到对等方 A(调用browser:foundPeer:withDiscoveryInfo:)。
  • 与此同时,对等A选择关闭WaitingVC。广告停止 ( stopAdvertisingPeer )。
  • 在对等 B 发现对等 A 丢失(即调用browser:lostPeer:)之前,有几秒钟的滞后。
  • 如果在这几秒钟内,对等 B 选择邀请对等 A(似乎仍然可用于对等 B),对等 A 崩溃(是的,被邀请的人,他通常会停止广告)。
  • 对等 B 的邀请通常会超时,不会出现任何问题。

崩溃发生在队列 com.apple.NSNetServices.tcplistener-queue 中。dispatch_call_block_and_release调用在释放时失败 (EXC_BREAKPOINT )。

真的想知道,这是否是MC框架中的错误;还是我错过了一些清理程序?对等方 A 仅执行以下操作:

  • 应用委托:创建MCPeerID,存储在强属性中,
  • 应用委托:创建MCNearbyServiceAdvertiser,存储在强属性中,设置委托,
  • WaitingVC:调用startAdvertisingPeer,然后在完成后调用stopAdvertisingPeer

无论我做什么,崩溃似乎都会发生。如果MCNearbyServiceAdvertiser对象和MCPeerID对象被保存在WaitingVC中,因此在WaitingVC关闭后被销毁,则仍然会发生崩溃。

除此之外,一切正常(邀请程序,连接,交换数据);但是某些失败的几秒钟窗口并不真正可以接受。让广告商一直运行可以解决这个问题,但它只是在处理症状(而且这个"同步"功能在应用程序中很少使用,所以这也是一种矫枉过正)。

更新:

使用MCAdvertiserAssistant时也会发生同样的崩溃,如果我在对等 A 上调用它的 stop 方法,并在对等 B 上快速连接。此外,我在本教程中测试了场景:http://techmaster.vn/2013/09/multipeer-connectivity-quick-tutorial/- 结果是一样的:崩溃。所以我有一个强烈的怀疑,这是苹果方面的一个错误......

我一直在经历同样的崩溃,根据开发人员论坛中的此线程,其他人也是如此。已为其创建了错误报告:

开发人员论坛:多对等连接崩溃

我找到了一个简单的解决方法。我在启动浏览器之前添加了延迟。

为了填充整个故事,我创建了一个包装器,用MCSession替换GKSession。在特定情况下,连接被关闭并重新打开,两端同时关闭,因此它崩溃了。向浏览器启动添加延迟可以抵消另一端的拆卸,从而避免出现问题。

这看起来像是委托回调的问题

advertiser:didReceiveInvitationFromPeer:withContext:invitationHandler:

最有可能使用最后一个参数,邀请处理程序块。是否调用此方法?当 B 发生 A 崩溃时,一定有东西被调用,这似乎是唯一可以想象的切入点。

相关内容