我正在开发一个使用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);
}
提前致谢。
詹姆斯。
答案 0 :(得分:3)
我希望其中一个有所帮助:
实施session:didReceiveCertificate:fromPeer:certificateHandler:
我读了here这是必要的。
继续在两个同行之间进行浏览和宣传单向交易;也就是说,如果两者都在浏览,请不要接受两端的邀请(至少不接受邀请并通过您在invitationHandler()
中浏览的同一会话)。
将代码包含在块中的didChangeState中,如下所示:
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%d",state);
NSLog(@"%ld",(long)MCSessionStateConnected);
});
答案 1 :(得分: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
是我班上的一个伊娃。
HTH