2013-09-26 6 views
5

MultipeerConnectivity 프레임 워크에 대해 알아 보려면 follow the WWDC talk으로 보내려고합니다. 많은 잘못된 시작 후에 브라우저에 동료가 표시되고 초대장이 발급됩니다.Multipeer Connectivity : 초대장 수락 (기본 제공 브라우저 VC 사용)

그러나 피어 장치에서 "Accept"를 누르면 브라우저는 "Connecting"을 끝내지 않고 계속 표시합니다. 나는 MCBrowserViewController이 로직을 돌 보았고 브라우저의 사용자가 취소 또는 완료를 누를 때까지 기다릴 수 있고 대리자 메소드가 실행되었다고 생각했습니다. 나는 그것이 명백한 무엇인가 내기를했다. 그러나 그것은 나를 떠나고있다.

여기 관련 코드가 무엇을 희망합니다. AppDelegate에 있습니다. 다양한 델리게이트 메소드의 NSLog 문은 당연히 browserViewControllerDidFinish:에있는 것을 제외하고는 예상대로 호출됩니다.

브라우저 및 초대장이 표시된다는 것을 명심하십시오. 무엇인가이 맞습니다!

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]; 
} 
사전에

덕분에 @implementation에서 @interface에서

...

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

!

답변

16

감사 일 것이다. 그리고 여기에 있습니다 :

session:didReceiveCertificate:fromPeer:certificateHandler 메서드를 구현하면 MCSessionDelegate 메서드가 피어의 세션 연결 시도를 방해합니다. 해당 메소드에서 해당 연결을 명시 적으로 승인하거나 주석 처리해야합니다.

세부 사항 및 교훈 : 다양한 대리자 메서드의

내가 보여 주었다 코드뿐만 아니라, 내가 만든했다 그루터기 구현을. 한 MCSessionDelegate 방법은 이것이다 : 빅 - 오 클레어의 조언 @ 확장

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

} 

위에서, 나는 단지의 경우, 모든 대리자 메서드를보고 시작했다. 그리고 이것은 피어가 AdvertiserAssistant UI에서 Accept 단추를 누를 때 발동되었습니다.

이 방법을 사용하면 원치 않는 경우 피어가 합법적이며 연결할 수 없는지 (certificateHandler: 사용) 연결할지를 결정할 수 있습니다. 애플은

앱이 그 인증서를 신뢰할지 여부를 결정해야합니다 후 인근 피어의 인증서를 검사하고해야했다. 이 결정을 내리면 앱은 제공된 certificateHandler 블록을 호출하여 YES (근처 피어를 신뢰) 또는 NO (거부)를 전달해야합니다.

중요 :

는 또한, 당신은이 팁을 얻는 multipeer 연결 프레임 워크는 어떤 방식으로 피어 제공 정체성이나 인증서의 유효성을 검사하는 것이 아니다. 대리인이이 메서드를 구현하지 않으면 모든 인증서가 자동으로 수락됩니다.

이 방법을 주석 처리했을 때 연결이 완료되어 최소한이 문제는 해결되었습니다.

+0

정말 고마워요. 그러면 디버깅 시간이 절약되었습니다. 방금 후에 구현하기 위해 모든 대리자 메소드를 던져서 didReceiveCertificate조차 알지 못했습니다. – cargath

1

새 MC 프레임 워크로 작업 할 때 MCBrowserViewController 라우트를 사용하지 않았지만 WWDC 프레젠테이션의 슬라이드 51에서 사용자가 완료되면 browserViewControllerDidFinish:이 호출되는 것처럼 보입니다. 이 콜백은 피어가 여전히 "연결 중 ..."으로 나타나면 문제가있는 곳이 아닐 것입니다.

피어를 세션에 수동으로 연결해야하는지 궁금합니다. 이미 MCSession 대표를 설정 중이므로 session:peer:didChangeState을 구현하고 있다고 가정합니다. 중단 점을 설정하고 MCSessionStateMCSessionStateConnected 일 때를 감시합니다. 내가 확신 할 수없는 유일한 점은 광고주 측, 브라우저 측 또는 둘 다에서 수동으로 처리해야하는 경우입니다. 어떤 단계에서 프레임 워크가 처리를 중단했는지 파악할 수 있다면 도움이 될 것입니다.

+0

좋은 생각, 업데이트 : 위임 호출을 더 신중하게보고 (아래 @Alla의 제안을 구현할 때) 장치가 연결을 거부하면 ** didChangeState'가 연결되지 않음 **으로 표시되는 것을 볼 수 있습니다. 그러나 그것을 받아들이면 변화가 없습니다. 그래서 나는 여전히 의아해하고 있습니다 (여전히 찾고 있습니다). 어떤 제안을 환영합니다! –

+0

나는 또한이 시점에있어 내 접근 방식은 currentSession이라는 정적 옵션을 설정하는 것이다. 게임에서이 객체를 참조하여 데이터 패킷을 보냅니다. 이 방법은 세션 보고서가 연결되어 있지 않을 때 이것을 nil로 설정할 수 있으며 게임은 네트워크 연결 실패를 정상적으로 처리 할 수 ​​있습니다. 그런 식으로 나는 결코 브라우저 세션이나 광고 세션을 직접 언급하지 않습니다. – FrostyL

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]; 
} 
+0

감사합니다. 그것을 시도하고 그것은 작동하지 않았지만, 실제 문제 (아래)를 찾을 수있었습니다. 일단 발견이 이루어지면, 나는 돌아가서 하나의 세션으로 시도했고, 지금까지는 잘 작동하고있다. 물론, 나는 아직도 일을하기위한 발견을 얻고 있기 때문에 조만간 당신의 제안이 필요할지도 모른다. 일이 진행됨에 따라 보고서를 보내 드리겠습니다. :) –

+1

이 하나는 나를 위해 일한, [appcoda] (http://www.appcoda.com/intro-multipeer-connectivity-framework-ios-programming/)에서 자습서를 사용하고 있었고 광고에 대해 동일한 세션을 사용하고있었습니다. 및 통신, "완료"버튼을 결코 해고. – Deano