接受邀请多对等连接

我希望我不会通过发布这个问题来违反NDA。

我正在使用新的多路连接,使用蓝牙发送一些文件到附近的设备。 我设法发送邀请,但我似乎并没有得到如何显示一个UIAlertView用户可以接受或拒绝邀请。 当用户发送时,文件自动保存并且没有接受/拒绝警​​报。

代码是:

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

但警报:

 - (void) advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler{ DevicePeer = [MCPeerID alloc]; DevicePeer = peerID; ArrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]]; // ask the user UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:@"" delegate:self cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil]; [alertView show]; alertView.tag = 2; } 

和alert alert方法:

  - (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { // retrieve the invitationHandler // get user decision BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO; // respond MCSession *session = [ArrayInvitationHandler objectAtIndex:0]; void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0]; invitationHandler(accept, session); } 

当用户按是的应用程序崩溃,我得到的错误:

 [__NSMallocBlock__ nearbyConnectionDataForPeer:withCompletionHandler:]: unrecognized selector sent to instance 0x14d4e3b0' 

我查了一下IOS开发者库,除此之外没有其他的方法

 - (void)nearbyConnectionDataForPeer:(id)arg1 withCompletionHandler:(id)arg2{ } 

没有工作。 没有信息在IOS开发者论坛。 有任何想法吗?

Alessandro是对的,这在WWDC 2013video中没有解释。 我自己也在努力。

我认为你在正确的轨道上,你只是有一些逻辑错误。 我不明白这两行:

 MCSession *session = [ArrayInvitationHandler objectAtIndex:0]; void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0]; 

存储在你的数组中的对象只是你的处理程序。 你得到这个崩溃的原因是,浏览器看到accept是真实的,并试图将对等体连接到会话,但是你将会返回的会话是零。 要解决这个问题,你想传回一个你创build的新会话。

起初,当浏览器端创build了一个新会话的时候,我感到很困惑,但是后来我意识到,我们并没有从浏览器那里得到这个会话,而且我们也不能真的把它传回去进入邀请处理程序,如果它不存在!

所以是的,做这个,而不是:

 BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO; // respond MCSession *session; if(accept) { session = [[MCSession alloc] initWithPeer:peer]; session.delegate = self; } void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0]; invitationHandler(accept, session); 

我build议你在Apple开发者中心观看MultiPer Connectivity WWDC 2013video的周边networking。 有一个关于这个东西的例子,这个很好解释。

PS:是的,你打破NDA(9月14日),但现在没关系:)