2013-09-28 5 views
2

내 응용 프로그램의 ios7에서 멀티 페어 연결을 사용하고 있습니다. 파일 전송 및 수신은 절대적으로 잘 작동하지만 사용자가 내 앱 (제어 센터 또는 설정)에서 액세스하여 블루투스 또는 Wi-Fi를 끄는 순간 파일 교환이 중단됩니다. 사용자가 두 가지를 모두 마녀로 돌려 놓으면 여전히 작동하지 않습니다. 사용자가 다시 작업하려면 사용자가 앱을 닫았다가 다시 열어야합니다.사용자가 블루투스를 껐다 켤 때 멀티 페 이더 연결이 작동하지 않습니다.

MCSession *session = [[MCSession alloc] 
              initWithPeer:key]; 


        NSCalendar *gregorian = [[NSCalendar alloc] 
              initWithCalendarIdentifier:NSGregorianCalendar]; 

        NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
        dateComponents.year = 2100; 
        dateComponents.month = 1; 
        dateComponents.day = 1; 
        dateComponents.hour = 0; 
        dateComponents.minute = 0; 
        dateComponents.second = 0; 

        NSDate *referenceDate = [gregorian dateFromComponents: dateComponents]; 

        NSDate *now = [NSDate date]; 
        NSTimeInterval interval = [now timeIntervalSinceDate:referenceDate]; 

        NSData *Recording = [NSData dataWithContentsOfFile:myFilePath]; 


        NSString* str = [NSString stringWithFormat:@"%@.ext", button.titleLabel.text]; 


        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
        [dict setObject:str forKey:@"fileName"]; 
        [dict setObject:@"Recording" forKey:@"fileType"]; 
        [dict setObject:Recording forKey:@"FileData"]; 

        NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:dict]; 

        [browser invitePeer:key 
           toSession:session 
          withContext:myData 
           timeout:interval]; 

사용자는 사용하여 언제든지 장치를 다시로드 할 수 있습니다 :

파일은 이런 방식으로 전송됩니다

[browser startBrowsingForPeers]; 

내가 문제가 시간 제한이라고 생각,하지만 난 아니다 확실한.

+0

'- (void) applicationDidBecomeActive : (UIApplication *) application' 응용 프로그램 대리인 메서드에서 세션을 다시 초기화해야합니다. 이 메소드는 컨트롤 센터를 열고 닫은 후에 앱이 다시 활성화 될 때 호출됩니다. –

+0

세션을 다시 초기화하면 MCSession 또는 MCNearbyServiceAdvertiser 및 MCNearbyServiceBrowser를 의미합니까? – Alessandro

+0

가능하다면 Multipeer Connectivity Framework과 관련이있는 모든 것을 다시 시작하십시오. 연결된 모든 피어를 다시 연결해야합니다. –

답변

2

- (void)applicationDidBecomeActive:(UIApplication *)application 응용 프로그램 대리인 메서드에서 모든 Multipeer Connectivity Framework 관련 인스턴스를 다시 시작해야합니다. 이 메소드는 컨트롤 센터를 열고 닫은 후에 앱이 다시 활성화 될 때 호출됩니다.

1

대신 연결 상태의 변경 사항을 모니터링하고 변경 사항을 감지하면 연결 해제 또는 재 초기화를 제안합니다. 여기에 우수한 도달 가능성 키트를 사용하여이 같은 문제에 대한 나의 방법이다 :

- (void)monitorReachability 
{ 
    // Allocate a reachability object 
    self.reachability = [Reachability reachabilityWithHostname:@"www.google.com"]; 

    [[NSNotificationCenter defaultCenter] addObserverForName:kReachabilityChangedNotification object:nil queue:nil usingBlock:^(NSNotification *note) { 
     Reachability *reachability = note.object; 
     if (reachability.isReachable) { 
      self.isPhysicallyConnected = YES; 
      [self updateNearbyService]; 
     } else { 
      self.isPhysicallyConnected = NO; 
      [self tearDownNearbyService]; 
     } 
    }]; 

    // Start the notifier, which will cause the reachability object to retain itself! 
    [self.reachability startNotifier]; 
} 
teardown에서

update 당신이 당신의 Multipeer 스택을 재구성한다.

+0

흥미 롭습니다. 그러나 구글이 무너 지거나 인터넷 연결이 끊어지면 어떻게 될까? 그런 다음 프로그램은 이유없이 세션을 다시 시작합니다. OP는 와이파이가 아니라 블루투스에 관한 이야기입니다. (참고로, 내가 downvoter 아니 었어) –

+1

그 주셔서 감사합니다. 네, 블루투스 연결 상태를 독점적으로 탐지 할 수있는 방법이 없습니다 (iOS 7 기준). 이것은 "응용 프로그램이 앞으로 나올 때마다 세션을 다시 시작"하기 때문에 원본 질문에 대한 완벽한 대답이 실제로 존재하지 않는 이유입니다. – SG1