1

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

提前致谢。

詹姆士。

4

2 回答 2

3

我希望其中之一会有所帮助:

  • 实施我在这里session:didReceiveCertificate:fromPeer:certificateHandler: 读到这是必要的。

  • 保持两个同行之间的浏览和广告单向交易;也就是说,如果两端都在浏览,则不要接受两端的邀请(至少不要接受邀请并传递您正在浏览的同一会话invitationHandler())。

  • 将您的代码包装在 didChangeState 中,如下所示: dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%d",state); NSLog(@"%ld",(long)MCSessionStateConnected); });

于 2014-01-30T16:57:45.160 回答
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我班上的伊瓦尔在哪里。

高温高压

于 2014-06-16T20:49:26.347 回答