多重连接 - 状态不变

时间:2014-01-26 21:06:37

标签: iphone ios7 delegates multipeer-connectivity

我正在开发一个使用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);
}

提前致谢。

詹姆斯。

2 个答案:

答案 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