邀请停止广告的同伴时,Multipeer Connectivity崩溃

时间:2013-10-20 08:26:38

标签: objective-c ios7 multipeer-connectivity

我有以下情况:

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

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

我真的很想知道,如果这是MC框架中的一个错误;还是我错过了一些清理程序?同行 A 仅执行以下操作:

  • App delegate:创建MCPeerID,存储在强大的属性中
  • App delegate:创建MCNearbyServiceAdvertiser,存储在强大的属性中,设置委托
  • WaitingVC:致电startAdvertisingPeer,然后在完成后致电stopAdvertisingPeer

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

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

更新

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

3 个答案:

答案 0 :(得分:5)

我一直在经历同样的崩溃,并根据Dev论坛中的这个帖子,所以请其他人。已经为它创建了一个错误报告:

Developer Forums: Multipeer Connectivity Crash

答案 1 :(得分:0)

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

advertiser:didReceiveInvitationFromPeer:withContext:invitationHandler:

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

答案 2 :(得分:0)

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

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