3

我有以下情况:

  • 对等点A在自定义 UI 中等待邀请(我们称之为WaitingVC)。MCNearbyServiceAdvertiser对象在应用程序启动时被初始化,广告在出现时开始( startAdvertisingPeer) WaitingVC
  • 对等BMCNearbyServiceBrowser启动并运行,也具有自定义 UI(即,不使用 Apple 提供的MCBrowserViewController)。
  • 对等点B找到对等点Abrowser:foundPeer:withDiscoveryInfo:被调用)。
  • 同时 Peer A选择关闭WaitingVC. 广告停止(stopAdvertisingPeer)。
  • 在 Peer B发现 Peer A丢失(browser:lostPeer:即被调用)之前,有几秒钟的延迟。
  • 如果在这几秒钟内,Peer B选择邀请 Peer A(似乎仍可用于 Peer B),则 Peer A崩溃(是的,被邀请的,通常停止广告)。
  • Peer B的邀请正常超时,没有问题出现。

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

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

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

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

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

更新:

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

4

3 回答 3

5

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

开发者论坛:多点连接崩溃

于 2013-10-21T19:51:04.597 回答
0

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

advertiser:didReceiveInvitationFromPeer:withContext:invitationHandler:

最有可能使用最后一个参数,invitationHandler 块。这个方法被调用了吗?当 B 使 A 崩溃时,一定有一些东西被调用,这似乎是唯一可以想象的入口点。

于 2013-10-20T08:45:38.220 回答
0

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

为了完成整个故事,我创建了一个包装器来用 MCSession 替换 GKSession。连接在特定情况下同时被两端同时关闭和重新打开,因此它崩溃了。向浏览器开始添加延迟可以将其从另一端的拆除中抵消,从而避免问题。

于 2016-01-15T18:44:05.787 回答