多点连接:接受邀请(使用内置浏览器 VC)

问题描述 投票:0回答:3

我正在尝试关注 WWDC 演讲来了解 MultipeerConnectivity 框架。经过多次错误启动后,浏览器会显示对等方,并发出邀请。

但是当我在对端设备上按“接受”时,浏览器一直显示“正在连接”,没有结束。我认为

MCBrowserViewController
负责处理逻辑,我可以放松,直到浏览器的用户按下“取消”或“完成”,然后触发委托方法。我敢打赌这是显而易见的事情,但我却无法理解。

这是我希望的相关代码。我在 AppDelegate 中有它。正如我所期望的那样,各种委托方法中的 NSLog 语句都会被调用——当然,

browserViewControllerDidFinish:
中的语句除外。

请记住,浏览器和邀请确实会出现,所以某事是正确的!

在@界面...

@property   (strong, nonatomic) MCSession   *theSession;
@property   (strong, nonatomic) MCAdvertiserAssistant       *assistant;
@property   (strong, nonatomic) MCBrowserViewController     *browserVC;

在@实现中

static    NSString* const    kServiceType = @"eeps-multi";

// called from viewDidAppear in the main ViewController

-(void)     startSession
{
    if (!self.theSession) {
        UIDevice *thisDevice = [UIDevice currentDevice];
    
        MCPeerID *aPeerID = [[ MCPeerID alloc ] initWithDisplayName: thisDevice.name];
        self.theSession = [[ MCSession alloc ] initWithPeer: aPeerID ];
        self.theSession.delegate = self;
    } else {
        NSLog(@"Session init skipped -- already exists");
    }
}

// called from viewDidAppear in the main ViewController

- (void)    startAdvertising
    {
    if (!self.assistant) {
        self.assistant = [[MCAdvertiserAssistant alloc] initWithServiceType:kServiceType
                                                              discoveryInfo:nil
                                                                    session:self.theSession ];
        self.assistant.delegate = self;
        [ self.assistant start ];
    } else {
        NSLog(@"Advertiser init skipped -- already exists");
    }
}

// called from the main ViewController in response to a button press

- (void)    startBrowsing
{
    if (!self.browserVC){
        self.browserVC = [[MCBrowserViewController alloc] initWithServiceType:kServiceType 
                                                                      session:self.theSession];
        self.browserVC.delegate = self;
    } else {
        NSLog(@"Browser VC init skipped -- already exists");
    }

    [ self.window.rootViewController presentViewController:self.browserVC animated:YES completion:nil];
}
cocoa-touch ios7 multipeer-connectivity
3个回答
15
投票

如果您实现

MCSessionDelegate
方法
session:didReceiveCertificate:fromPeer:certificateHandler
方法,它将拦截对等方连接到会话的尝试。您应该在该方法中明确批准该连接或将其注释掉。

细节和经验教训:

除了我展示的代码之外,我还对各种委托方法进行了粗略的实现。一种

MCSessionDelegate
方法是这样的:

- (void)          session:(MCSession *)session 
    didReceiveCertificate:(NSArray *)certificate 
                 fromPeer:(MCPeerID *)peerID 
       certificateHandler:(void (^)(BOOL))certificateHandler
{

}

扩展@Big-O Claire 的上述内容,我开始观察所有这些委托方法,以防万一。当对方点击 AdvertiserAssistant UI 中的“接受”按钮时,就会触发此操作。

此方法使您有机会决定对等点是否合法,如果您不想连接,则不连接(使用

certificateHandler:
)。苹果说,

您的应用程序应检查附近对等方的证书,然后应决定是否信任该证书。做出该决定后,您的应用程序应调用提供的certificateHandler块,传递YES(信任附近的对等点)或NO(拒绝它)。

此外,您还会得到以下提示:

重要:多点连接框架不会尝试以任何方式验证对等提供的身份或证书。如果您的委托没有实现此方法,所有证书都会自动接受。

当我注释掉这个方法时,连接就通过了——至少这个问题得到了解决。


3
投票

我遇到了同样的问题,结果我对浏览器和广告商使用了相同的会话。分开会话,但确保服务类型相同,它会像魅力一样工作

- (void) setUpMultipeer{
    //  Setup Peer ID
    self.myPeerID = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];

    //  Setup Sessions
    self.advertiseSession = [[MCSession alloc] initWithPeer:self.myPeerID];
    self.advertiseSession.delegate = self;

    self.browserSession = [[MCSession alloc] initWithPeer:self.myPeerID];
    self.browserSession.delegate = self;


    //  Setup BrowserVC
    self.browserVC = [[MCBrowserViewController alloc] initWithServiceType:@"SERVICE_TYPE" session:self.browserSession];
    self.browserVC.delegate = self;

    //  Setup Advertiser
    self.advertiser = [[MCAdvertiserAssistant alloc] initWithServiceType:@"SERVICE_TYPE" discoveryInfo:nil session:self.advertiseSession];
    [self.advertiser start];
}

1
投票

在使用新的 MC 框架时,我自己并没有走

MCBrowserViewController
路线,但从 WWDC 演示文稿的幻灯片 51 来看,确实看起来
browserViewControllerDidFinish:
仅在用户按下完成时才被调用。因此,如果您的对等点仍然显示为“正在连接...”,则此回调可能不是问题所在。

我想知道您是否必须手动将您的同级连接到会话。您已经设置了

MCSession
委托,因此我假设您正在实现
session:peer:didChangeState
。设置断点并观察
MCSessionState
何时为
MCSessionStateConnected
。我唯一不确定的是您是否需要在广告商端、浏览器端或两者上手动处理此问题。如果您能弄清楚框架在哪一步停止处理它,那将会很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.