2015-10-09 4 views
2

Это мой первый пост, посвященный stackoverflow, и я знаю о строгих требованиях к публикации. Пожалуйста, дайте мне знать, если я не буду следовать ни одному из рекомендаций.Приглашение Peer на MCSEssion

В настоящее время я пишу приложение IOS (8.4) в Xcode, используя Objective-C. Целью является использование MCSessions для потоковой передачи данных между устройствами IOS. В настоящее время я борюсь с концепцией сессий, несмотря на чтение многочисленных сообщений здесь и в других местах, которые пытаются прояснить тему. Вот ресурсы, я уже в курсе:

https://developer.apple.com/videos/play/wwdc2013-708/

https://medium.com/@phoenixy/using-multipeer-connectivity-120abacb9db

Вот мое текущее понимание: На самом базовом уровне, у вас есть рекламодатель, и браузер. Рекламодатель имеет локальный сеанс, который позволяет им «рекламировать». Когда браузер видит рекламодателя, браузер отправляет приглашение рекламодателю на его (в браузере) локальный MCSession. Предполагая, что это все правильно, вот где я смущаюсь. Рекламодатель может принять приглашение и в этом процессе передает свою локальную сессию приглашению.

Я реализовал следующую логику в коде, как показано ниже. Однако при отслеживании изменений состояния MCSession как для рекламодателя, так и для браузера происходит попытка соединения, но конечное состояние всегда выполняетсяNotNonnect.

Код для отправки приглашения (Browser):

[self.broadcasterBrowser invitePeer:[broadcasterPeerIDs objectAtIndex:indexPath.row] 
     toSession: self.appDelegate.mpcHandler.session withContext:nil timeout:30.0 ]; 

Код для принятия приглашения (рекламодатель):

 - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser 
didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler 
    { 
     ArrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]]; 

     // ask the user 
     UIAlertView *alertView = [[UIAlertView alloc] 
            initWithTitle:peerID.displayName 
            message:@"Would like to create a session with you" 
            delegate:self 
            cancelButtonTitle:@"Decline" 
            otherButtonTitles:@"Accept", nil]; 
     [alertView show]; 

     if (alertViewResult) 
     { 
      void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0]; 
      invitationHandler(YES, self.appDelegate.mpcHandler.session); 


     } 
    } 

Любая помощь очень ценится!

Остин

ответ

0

Я столкнулся с аналогичной проблемой, пытаясь использовать MPC. Я создал специальный класс для обработки всех сведений о подключении MPC. Хотя при тестировании, каждый раз, когда мой рекламодатель будет принимать приглашение, он будет жаловаться на неправильные данные подключения и терпеть неудачу. Я обнаружил, что проблема заключалась в том, что я был вендинг из объекта MCPeerID для моего устройства из класса переменного я создал, как показано ниже:

static var peerObject : MCPeerID { 
    return MCPeerID(displayName: deviceNameString) 
} 

lazy var sessionIVar = MCSession (peer: MyConnectivityClass.peerObject) 

func startAdvertisingForConnectivity() { 
    advertiserService = MCNearbyServiceAdvertiser (peer: MyConnectivityClass.peerObject, discoveryInfo: nil, serviceType: "my-multipeer-connectivity-service-identifier") 
} 

Тогда, когда я получил приглашение, я бы инициализировать объект MCSession с помощью «PeerObject» вычислен имущество и вернуть его в обработчик приглашения, как это:

func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Swift.Void) { 
    invitationHandler(true, sessionIVar) 
} 

Я предположил, что каждый раз, когда я призывал «MyConnectivityClass.peerObject» было бы вернуть идентичную peerID, потому что я всегда инициализирует его с таким же дисплеем имя. Оказывается, это неправда. Поэтому, когда я рекламировал, я использовал один объект peerID, а затем, когда я отвечал на приглашение, я отвечал на объект MCSession, который содержал совершенно другой peerID.

Таким образом, решение заключалось в изменении значения вычисленного класса «MyConnectivityClass.peerObject» в константу или Ivar в моем классе обработчика соединения. Как это:

let peerObject : MCPeerID = MCPeerID(displayName: deviceNameString) 

Тогда остальная часть кода просто работал, потому что независимо от того, сколько раз я назвал для объекта MCPeerID, это всегда было то же самое. Оглядываясь назад, я не знаю, почему я начал с нее так, как я.:-)

Затем в моем классе подключения я архивировал и сохранял объекты MCPeerID как для браузера, так и для рекламодателя, чтобы я мог рекламодателю автоматически принять приглашение для доверенных идентификаторов MCPeerID. Это невозможно, если вы создаете объект MCPeerID каждый раз, когда используете его, даже если вы всегда инициализируете его с тем же DisplayName.

 Смежные вопросы

  • Нет связанных вопросов^_^