接受邀请多对等连接
我希望我不会通过发布这个问题来违反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日),但现在没关系:)