я думаю, что вы получили его назад. IFAIK, discoveryInfo MCAdvertiserAssistant - это информация, переданная от рекламодателя для браузеров. Эта информация передается:
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info
который является метод делегата для класса MCNearbyServiceBrowser. И к этому:
– browserViewController:shouldPresentNearbyPeer:withDiscoveryInfo:
Which is the delegate for the MCBrowserViewController class.
Эта информация должна быть использована для проверки того, должен ли этот рекламодатель отображаться для вашего пользователя.
Если вы заинтересованы в перехвате попытки приглашения, вам следует рассмотреть возможность использования класса MCNearbyServiceAdvertiser вместо помощника. Таким образом, вы можете делегировать метод didReceiveInvitationFromPeer и добавить пользовательскую логику к нему:
// pedido para entrar na sala.
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID
withContext:(NSData *)context
invitationHandler:(void (^)(BOOL accept, MCSession *session))invitationHandler {
// get the browser's info
NSDictionary *peerInfo = (NSDictionary *) [NSKeyedUnarchiver unarchiveObjectWithData:context];
//check if peer is valid for this room (add your custom logic in this method)
if ([self isValidForThisRoom:peerInfo]) {
//create an alert
NSObject *clientName = [peerInfo valueForKey:@"playerName"];
NSString *clientMessage = [[NSString alloc] initWithFormat:@"%@ wants to connect. Accept?", clientName];
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Accept Connection?"
message:clientMessage
delegate:self
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes", nil];
[alertView show];
// copy the invitationHandler block to an array to use it later
ArrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]];
} else {
// if the peer is not valid, decline the invitation
invitationHandler(NO, _session);
}
}
На clickedButtonAtIndex делегата для alertview, вы можете сделать что-то вроде этого:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
//obtem a decisao do usuario
BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO;
// obtem o invitationHandler que foi guardado do didReceiveInvitationFromPeer
void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];
// chama o invitationHandler passando a nossa session
invitationHandler(accept, _session);
}
Два важных вещей, чтобы заметить заключается в том, что:
Ваш объект сеанса должен быть переменной экземпляра, а не локальной, как я видел в некоторых образцах кода. По моему опыту, я просто создал статический общий экземпляр для хранения объекта сеанса. Это также хороший план, если вы хотите передать сеанс с одного экрана на другой.
Обратите внимание, что вы должны создать NSArray * ArrayInvitationHandler; переменной для сохранения блочного кода. Я попытался сделать Block_copy, но у него были некоторые ошибки преобразования, поэтому someone здесь, в stackoverflow, решили хранить в массиве, который, по моему мнению, достаточно изящный.
В любом случае, я получил эту работу, используя эту настройку. Надеюсь, это вам поможет: D
Думаю, я был смущен, когда я написал этот вопрос. Я действительно искал пользовательский MCBrowserViewController для отображения информации в ближайшем списке сверстников. Я задал новый вопрос. http://stackoverflow.com/questions/19185267/ios7-multipeer-connectivity-creating-custom-nearby-browser-list-using-advertiser Но вы определенно ответили на вопрос, который я задал. Спасибо, Gui! –