Многопользовательское подключение — состояние не меняется

Я работаю над приложением, использующим Multipeer Conectivity Framework. Пока все идет отлично, я реализовал программный просмотр и приглашения.

Моя проблема заключается в том, что когда пользователь принимает приглашение, браузер не получает изменение состояния, тем самым не создавая сеанс.

Это рекламодатель получил метод приглашения, который я создал с помощью листа действий, интегрированного с блоками.

    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID
       withContext:(NSData *)context
 invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
{

    [UIActionSheet showInView:self.view
                    withTitle:[[NSString alloc]initWithFormat:@"%@ would like to share %@ information with you.",peerID.displayName, (NSString *)context]
            cancelButtonTitle:@"Cancel"
       destructiveButtonTitle:@"Deny"
            otherButtonTitles:@[@"Accept"]
                     tapBlock:^(UIActionSheet *actionSheet, NSInteger buttonIndex) {
                         NSLog(@"%i",buttonIndex==1?true:false);
                         MCSession *newSession=[[MCSession alloc]initWithPeer:[[MCPeerID alloc] initWithDisplayName:@"CRAP23456"]];
                         [newSession setDelegate: self];
                         NSLog(@"button index %i ",buttonIndex==1?true:false);
                         invitationHandler(buttonIndex==1?YES:NO,newSession);
                     }];
}

Приведенный выше метод вызывается, и обработчик приглашения возвращает правильное значение.

Моя реализация со стороны браузера очень проста — и это метод, который следует вызывать, когда пользователь либо принимает, либо отклоняет метод. Однако он вызывается только тогда, когда пользователь отклоняет приглашение:

 - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
{
    NSLog(@"%d",state);
    NSLog(@"%ld",(long)MCSessionStateConnected);
}

Заранее спасибо.

Джеймс.


person user3238439    schedule 26.01.2014    source источник


Ответы (2)


Я тоже столкнулся с этой проблемой. Мой код на стороне браузера выглядел так:

MCSession *session = [[MCSession alloc] initWithPeer:[self peerID]];
session.delegate = self;
[browser invitePeer:peerID toSession:session withContext:nil timeout:30.0f];

Проблема в том, что браузер не сохраняет ссылку на сеанс, поэтому ARC приходит и очищает его до того, как другой конец получит возможность принять.

Изменение его на следующее устранило проблему:

_session = [[MCSession alloc] initWithPeer:[self peerID]];
_session.delegate = self;
[browser invitePeer:peerID toSession:_session withContext:nil timeout:30.0f];

.. где _session — это ивар моего класса.

ХТН

person Sebastien Martin    schedule 16.06.2014
comment
Спасибо, что предложили этот тип проблемы. Оказывается, проблема существует и с браузером, и с рекламодателем. Как только я сделал на них постоянную ссылку в ARC, система начала работать. - person Peter B. Kramer; 27.12.2017

Я надеюсь, что один из них поможет:

  • Реализовать session:didReceiveCertificate:fromPeer:certificateHandler: Я прочитал здесь, что это необходимо.

  • Сохраняйте просмотр и рекламу между двумя сверстниками в одностороннем порядке; то есть не принимайте приглашения на обоих концах, если оба также просматривают (по крайней мере, не принимайте приглашение и пропускайте тот же сеанс, который вы просматриваете в invitationHandler()).

  • Оберните свой код в didChangeState в такой блок: dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%d",state); NSLog(@"%ld",(long)MCSessionStateConnected); });

person user1857711    schedule 30.01.2014