Ios MultiPier McNearByBrowser服务崩溃

Ios MultiPier McNearByBrowser服务崩溃,ios,objective-c,exception,p2p,multipeer-connectivity,Ios,Objective C,Exception,P2p,Multipeer Connectivity,我有一个应用程序正在使用MultiPeer连接框架。每次应用程序在AppDelegate中激活时,我都会创建一个新的MCSession,一个MCNearbyBrowserService,一个MCNearbyAdvertiserService,并调用start browsing和start Advertision。然后,每当应用程序在AppDelegate中处于非活动状态时,我就会停止浏览和广告,并将所有内容设置为零。我发现MCNearbyBrowserService在其同步队列中导致崩溃: **

我有一个应用程序正在使用MultiPeer连接框架。每次应用程序在AppDelegate中激活时,我都会创建一个新的MCSession,一个MCNearbyBrowserService,一个MCNearbyAdvertiserService,并调用start browsing和start Advertision。然后,每当应用程序在AppDelegate中处于非活动状态时,我就会停止浏览和广告,并将所有内容设置为零。我发现MCNearbyBrowserService在其同步队列中导致崩溃:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -    [__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]'
*** First throw call stack:
(0x2de3ee8b 0x381396c7 0x2dd7caef 0x2dd7c8b3 0x2f648167 0x2f6493af 0x3861e103 0x38622e77 0x3861ff9b 0x38623751 0x386239d1 0x3874ddff 0x3874dcc4)
libc++abi.dylib: terminating with uncaught exception of type NSException
有时当应用程序重新打开时

以下是我的ApplicationIDBecomeActive代码:

self.myIdentifier = [[MCPeerID alloc] initWithDisplayName:[self.class createHash:20]];

self.mainSession = [[MCSession alloc] initWithPeer:self.myIdentifier];
self.mainSession.delegate = self;

peerAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myIdentifier discoveryInfo:nil serviceType: service];
peerAdvertiser.delegate = self;
peerBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.myIdentifier serviceType: service];
peerBrowser.delegate = self;

acceptReset = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(reset) userInfo:nil repeats:YES];
acceptPosts = true;
[peerBrowser startBrowsingForPeers];
[peerAdvertiser startAdvertisingPeer];

self.isBrowsing = true;
下面是我的applicationWillResignActive代码:

[acceptReset invalidate];
[peerAdvertiser stopAdvertisingPeer];
[peerBrowser stopBrowsingForPeers];
[self.mainSession disconnect];
self.mainSession = false;
self.isBrowsing = false;

完整的代码可以在这里查看:

我记得遇到过这个问题,快速解决方法是取消代理,释放浏览器和广告商。因此,假设您的应用程序代理对每个应用程序都具有强属性,则安装方法如下所示:

self.peerAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myIdentifier discoveryInfo:nil serviceType: service];
self.peerAdvertiser.delegate = self;

self.peerBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.myIdentifier serviceType: service];
self.peerBrowser.delegate = self;
然后当应用程序进入后台时(或以其他方式希望停止浏览/广告):


我还建议不要在每次应用发布时都创建一个新的
mcpherid
,因为Multipeer连接性有发现老同事的习惯,每次重新发布时你都会发现你的“前我”

运气好吗?我有一个类似的问题。。。但是蒂姆很难找到解决方案。。。!最后我不得不放弃一心多用。很遗憾,苹果的图书馆有这么多的虫子。我收到了完全相同的例外。在我的例子中,这是在我甚至还没有开始邀请/接受之前就发出了PeerNotConnected通知。当广告客户正在断开连接并且浏览器试图邀请(重新连接)到广告客户时,我会看到这种情况。广告主可能需要一点时间才能真正消失,如果浏览器试图连接到正在消失的广告主,则会发生此错误。我知道这个线程很旧,但我实现了这个建议,它工作得很好,但现在(9.3.1),
self.peerAdvertisier.stopAdvertisingPeer()
导致应用程序随机崩溃。有什么想法吗?另外,将委托设置为nil和停止广告的顺序是否重要?@Cooperista我想说,在调用
stopAdvertisingPeer()
之前,应该将委托设置为nil,但不能确定崩溃的原因。你有日志吗?也许可以开始一个新的问题。谢谢。我会改变顺序,也许这一点就能解决问题。我正在使用crashlytics,所以我没有太多关于这是如何发生的信息,但如果有,我将用我所拥有的打开一个新的问题。
self.peerAdvertiser.delegate = nil;
[self.peerAdvertiser stopAdvertisingPeer];
self.peerAdvertiser = nil;

self.peerBrowser.delegate = nil;
[self.peerBrowser stopBrowsingForPeers];
self.peerBrowser = nil;

[self.mainSession disconnect];