6

MultipeerConnectivity フレームワークについて学ぶために、WWDC の講演をフォローしようとしています。何度も誤ったスタートを切った後、ブラウザにピアが表示され、招待が発行されます。

しかし、ピアデバイスで「同意する」を押すと、ブラウザは「接続中」と表示し続けます。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];
}

前もって感謝します!

4

3 に答える 3

15

私自身の間違いを見つけることにつながった優れた提案をしてくれたコメンターに感謝します。そして、ここにあります:

MCSessionDelegateメソッドメソッドを実装session:didReceiveCertificate:fromPeer:certificateHandlerすると、セッションに接続しようとするピアの試行がインターセプトされます。そのメソッドでその接続を明示的に承認するか、コメントアウトする必要があります。

詳細と教訓:

示したコードに加えて、さまざまなデリゲート メソッドのずんぐりした実装を作成しました。1つのMCSessionDelegate方法は次のとおりです。

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

}

上記の @Big-O Claire のアドバイスを拡張して、念のため、これらすべてのデリゲート メソッドを監視し始めました。これは、ピアが AdvertiserAssistant UI の Accept ボタンをタップしたときに発生しました。

この方法では、ピアが正当であるかどうかを判断し、接続certificateHandler:したくない場合は ( を使用して) 接続しないようにすることができます。アップル曰く、

アプリは近くのピアの証明書を検査し、その証明書を信頼するかどうかを決定する必要があります。その決定を下したら、アプリは提供された certificateHandler ブロックを呼び出し、YES (近くのピアを信頼する場合) または NO (拒否する場合) を渡す必要があります。

さらに、次のヒントが得られます。

重要: マルチピア接続フレームワークは、ピア提供の ID または証明書を検証しようとはしません。デリゲートがこのメソッドを実装していない場合、すべての証明書が自動的に受け入れられます。

この方法をコメントアウトすると、接続が確立され、少なくともこの問題は解決されました。

于 2013-10-06T16:29:04.400 に答える
3

私は同じ問題を抱えていましたが、ブラウザと広告主の両方に同じセッションを使用していたことが判明しました. セッションを分割しますが、 serviceType が同じであることを確認してください。魅力的に機能します

- (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];
}
于 2013-09-30T03:23:04.963 に答える