通过多种连接发送和接收邀请

时间:2013-10-21 05:20:07

标签: ios objective-c bluetooth p2p multipeer-connectivity

我知道之前已经问过这个问题,但我只是想知道为什么它在我的特定情况下不起作用。

我正在尝试从一个视图控制器发送多重连接的邀请,然后在另一个视图控制器上接收邀请。我的发送代码是:

[self invitePeer:selectedPeerID toSession:self.mySession withContext:nil timeout:timeInterval ];

和方法只是空白:

 - (void)invitePeer:(MCPeerID *)peerID toSession:(MCSession *)session withContext:(NSData *)context timeout:(NSTimeInterval)timeout 
 {

 }

我的接收和邀请代码是:

 - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler 
 {

      // http://down.vcnc.co.kr/WWDC_2013/Video/708.pdf  -- wwdc tutorial, this part is towards the end (p119)

      self.arrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]];
      // ask the user
      UIAlertView *alertView = [[UIAlertView alloc]
                          initWithTitle:peerID.displayName
                          message:@"Would like to create a session with you"
                          delegate:self
                          cancelButtonTitle:@"Decline" otherButtonTitles:@"Accept", nil];
      [alertView show];


  }

 - (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
 {
      // retrieve the invitationHandler and  check whether the user accepted or declined the invitation...

      BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO;

      // respond
      if(accept) {
              void (^invitationHandler)(BOOL, MCSession *) = [self.arrayInvitationHandler objectAtIndex:0];
    invitationHandler(accept, self.mySession);
          }
          else 
          {
              NSLog(@"Session disallowed");
          }
  }

我正确设置了所有委托方法以及相同的服务类型。但是当我尝试启动会话时,我点击的tableviewcell仍然会突出显示...

我想我必须在invitePeer toSession方法中添加一些东西,但我不确定......

我直接从Apple关于我的代码中引用的Multipeer Connectivity的wwdc谈话中复制了这个...你可以看到它是我自己的代码实现,我没有使用广告客户助手或mcbrowserviewcontroller。

有没有人对如何让这个工作有任何建议?

2 个答案:

答案 0 :(得分:3)

invitePeer: toSession: withContext: timeOut:方法由MCNearbyServiceBrowser实施,因此您应该在浏览器上调用该方法,而不是self

[browser invitePeer:selectedPeerID toSession:self.mySession withContext:nil timeout:timeInterval ];

但是,如果您尝试排除接受邀请的问题,我暂时跳过提醒视图,并立即接受广告客户代表的didReceiveInvitation:回调。

修改

我最初声明来自Multipeer Connectivity类的委托回调来自私有队列但是@Juguang指出这只是MCSessionDelegate回调的情况。

答案 1 :(得分:3)

对于任何有兴趣的人,我创建了MCSessionP2P,这是一个演示应用程序,用于说明MCSession的ad-hoc网络功能。 SessionController符合MCSessionDelegateMCNearbyServiceBrowserDelegateMCNearbyServiceAdvertiserDelegate,并充当UITableView的数据源。该应用程序通过Wi-Fi或蓝牙进行广告宣传,并以编程方式连接到可用的对等体,建立点对点网络。