【问题标题】:Accepting invitation multipeer connectivity接受邀请多人连接
【发布时间】:2013-09-19 08:41:53
【问题描述】:

我希望我发布这个问题没有违反保密协议。

我正在使用新的多点连接通过蓝牙将一些文件发送到附近的设备。我已经设法发送邀请,但我似乎不知道如何显示 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;
}

和警报查看方法:

 - (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 开发者论坛上没有信息。有什么想法吗?

【问题讨论】:

  • 请人回答!!这对我很重要

标签: ios multipeer-connectivity


【解决方案1】:

我建议您在 Apple 开发者中心观看 Nearby Networking with Multipeer Connectivity WWDC 2013 视频。有一个关于这个东西的例子,这很好解释。

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

【讨论】:

  • 我看过视频,但没有说明用户接受邀请后会发生什么
【解决方案2】:

Alessandro 是对的,这在 WWDC 2013 视频中没有解释。我自己也为此苦苦挣扎。

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

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

存储在您的数组中的对象只是您的处理程序。您遇到崩溃的原因是浏览器看到accept 为真,并尝试将对等方连接到会话,但您返回的会话为零。要解决此问题,您需要传回您创建的新会话。

起初,当浏览器端已经创建了一个新会话时,我对创建一个新会话的概念感到困惑,但后来我意识到我们无法从任何地方从浏览器获取该会话,而且我们真的不能如果不存在,则将其传回邀请处理程序!

所以,是的,改为这样做:

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);

【讨论】:

  • 那么 initwithpeer:peer 呢?这是我的 peerId 吗?
  • @Big-OClaire peer 这里是initWithPeer:peer,是你自己还是发送邀请的同伴?
  • 您使用自己的 peerId,而不是发送邀请的人
  • @Big-OClaire 谢谢。当我试图从客户端 - 主机的角度看待它时,我很难理解这个概念,但我已经意识到它更像是一种 p2p 网状结构。
  • @Yazid,我遇到了同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多