多点连接 - 状态不变
Posted
技术标签:
【中文标题】多点连接 - 状态不变【英文标题】:Multipeer Connectivity - State Not Changing 【发布时间】:2014-01-26 21:06:37 【问题描述】:我正在开发一个使用 Multipeer Conectivity Framework 的应用程序。到目前为止一切都很好,我已经实现了程序化浏览和邀请。
我的问题是当用户接受邀请时,浏览器没有收到状态更改 - 因此没有创建会话。
这是广告商确实收到了我使用与块集成的操作表创建的邀请方法。
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID
withContext:(NSData *)context
invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
[UIActionSheet showInView:self.view
withTitle:[[NSString alloc]initWithFormat:@"%@ would like to share %@ information with you.",peerID.displayName, (NSString *)context]
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:@"Deny"
otherButtonTitles:@[@"Accept"]
tapBlock:^(UIActionSheet *actionSheet, NSInteger buttonIndex)
NSLog(@"%i",buttonIndex==1?true:false);
MCSession *newSession=[[MCSession alloc]initWithPeer:[[MCPeerID alloc] initWithDisplayName:@"CRAP23456"]];
[newSession setDelegate: self];
NSLog(@"button index %i ",buttonIndex==1?true:false);
invitationHandler(buttonIndex==1?YES:NO,newSession);
];
正在调用上述方法,并且邀请处理程序正在返回正确的值。
我在浏览器端的实现非常简单 - 这是当用户接受/拒绝该方法时应该调用的方法。但是,只有在用户拒绝邀请时才会调用它:
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
NSLog(@"%d",state);
NSLog(@"%ld",(long)MCSessionStateConnected);
提前致谢。
詹姆斯。
【问题讨论】:
【参考方案1】:我希望其中一项对您有所帮助:
实现session:didReceiveCertificate:fromPeer:certificateHandler:
我读到here 说这是必要的。
保持两个同行之间的浏览和广告单向交易;也就是说,如果两端都在浏览,则不要接受两端的邀请(至少不要接受邀请并通过您在 invitationHandler()
中浏览的同一会话)。
将您的代码包装在 didChangeState 块中,如下所示:
dispatch_async(dispatch_get_main_queue(), ^
NSLog(@"%d",state);
NSLog(@"%ld",(long)MCSessionStateConnected);
);
【讨论】:
【参考方案2】:我也遇到过这个问题。我在浏览器端的代码如下所示:
MCSession *session = [[MCSession alloc] initWithPeer:[self peerID]];
session.delegate = self;
[browser invitePeer:peerID toSession:session withContext:nil timeout:30.0f];
问题在于浏览器不保留对会话的引用,因此 ARC 会在另一端有机会接受之前出现并清理它。
将其更改为以下解决了该问题:
_session = [[MCSession alloc] initWithPeer:[self peerID]];
_session.delegate = self;
[browser invitePeer:peerID toSession:_session withContext:nil timeout:30.0f];
.. _session
是我班上的 ivar。
HTH
【讨论】:
感谢您提出此类问题。事实证明,浏览器和广告商也存在问题。一旦我对它们进行了 ARC 持久引用,系统就开始工作了。以上是关于多点连接 - 状态不变的主要内容,如果未能解决你的问题,请参考以下文章