我有以下情况:
- 对等 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 崩溃时,一定有东西被调用,这似乎是唯一可以想象的切入点。