какой GKSession не подключается при каждой попытке?

В приложении вызывается приглашениеDidFail, иногда он подключается правильно, но иногда нет ...

какие могут быть причины отказа в соединении?

// Display an alert sheet indicating a failure to connect to the peer.
- (void) invitationDidFail:(SessionManager *)session fromPeer:(NSString *)participantID
{
NSString *str;
if (alertView.visible) {
    // Peer cancelled invitation before it could be accepted/rejected
    // Close the invitation dialog before opening an error dialog
    [alertView dismissWithClickedButtonIndex:0 animated:NO];
    [alertView release];
    str = [NSString stringWithFormat:@"%@ is busy.\nPlease again", participantID];
    //[peerList removeAllObjects];
    [self peerListDidChange:nil];
    [self.tableData reloadData];
    //[self TwoPlayer:self];
} else {
    // Peer rejected invitation or exited app.
    str = [NSString stringWithFormat:@"%@ is busy.\nPlease try again", participantID];
    //[peerList removeAllObjects];
    [self peerListDidChange:nil];
    [self.tableData reloadData];
    //[self TwoPlayer:self];
  }
}

Даже если он не вызывает этот метод, он уверен, что устройство не сопряжено с каким-либо другим устройством, тогда каковы причины, по которым когда-то оно принимает и вызывает метод didReceivedInvitation, или когда-то оно отклоняет, вызывая приглашениеDidFail.

// Invitation dialog due to peer attempting to connect.
- (void) didReceiveInvitation:(SessionManager *)session fromPeer:(NSString     *)participantID;
{
[alertView dismissWithClickedButtonIndex:1 animated:NO];

NSString *str = [NSString stringWithFormat:@"Incoming Invite from %@", participantID];
if (alertView.visible) {
    [alertView dismissWithClickedButtonIndex:0 animated:NO];
    [alertView release];
}
alertView = [[UIAlertView alloc] 
             initWithTitle:str
             message:@"Do you wish to accept?" 
             delegate:self 
             cancelButtonTitle:@"Decline" 
             otherButtonTitles:nil];
[alertView addButtonWithTitle:@"Accept"]; 
[alertView show];
}

person Chatar Veer Suthar    schedule 28.06.2011    source источник


Ответы (1)


Когда я недавно писал приложение, использующее соединения, я использовал GKSession. Я потратил недели, пытаясь отладить с ним проблемы с подключением, и в конце концов сдался и перестал его использовать. Похоже, что с GKSession при подключении возникает ряд проблем, особенно если вы отключаетесь, а затем пытаетесь повторно подключиться в течение короткого времени (короткое время может составлять 1 минуту или более). Кажется, что соединение не разрывается должным образом, а затем оно не восстанавливает соединение должным образом.

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

GCD Async Socket

person Nick Bull    schedule 28.06.2011
comment
Я использую игру, которая отправляет и получает данные при каждом нажатии, будет ли она поддерживать эту тему? - person Chatar Veer Suthar; 28.06.2011
comment
После того, как вы создали соединение с помощью асинхронного сокета GCD, вы можете использовать его так же, как GKSession - вы можете отправлять и получать данные так часто, как хотите. В моем тестировании я обнаружил, что он быстрее, чем GKSession, для передачи данных. Но это было довольно ограниченное тестирование, так как сеанс GKS был очень прерывистым. - person Nick Bull; 28.06.2011
comment
Можете ли вы дать мне какой-либо код, например систему чата или отправку и получение данных для iOS, просто для руководства? - person Chatar Veer Suthar; 28.06.2011
comment
Весь мой код заключен в проекты, от которых мне нелегко избавиться. Есть примеры с кодом GCD Async Socket, которого должно быть достаточно, чтобы все заработало (это все, что я использовал). В зависимости от того, как вы собираетесь это сделать, вам может потребоваться быстрое прочтение некоторых основ Bonjour, но мне потребовался один вечер, чтобы установить соединение, работающее с ним. - person Nick Bull; 28.06.2011
comment
Ник: Похоже, вам нужно начать новый сеанс после отключения. В остальном я должен сказать, что мне очень нравится GKSession API. Я считаю, что вы, возможно, оказываете себе и своим пользователям медвежью услугу, не используя его, поскольку это позволит вам выполнять специализированную многопользовательскую игру через Bluetooth (с задержкой 4 мс). - person Mark Pauley; 15.12.2012
comment
@MarkPauley Возможно, он был улучшен с тех пор, как я использовал его более года назад, но я пытался начать новые сеансы и т. Д. Он просто не мог повторно подключаться регулярно. Как я уже сказал, возможно, сейчас лучше. Но GCD Async Socket позволил мне иметь гораздо более легкий доступ ко всему, и он позволяет ad-hoc bluetooth, как GKSession. - person Nick Bull; 15.12.2012
comment
Интересно: мне интересно, какой API эта библиотека GCDAsync использует для создания специального соединения Bluetooth. - person Mark Pauley; 15.12.2012