Я думаю, вы получили это в обратном порядке. 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 для просмотра предупреждений вы можете сделать что-то вроде этого:
- (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, но возникли некоторые ошибки преобразования, поэтому кто-то здесь, в stackoverflow, решил хранить в массиве, который я считаю достаточно элегантным.
Во всяком случае, у меня все заработало, используя эту настройку. Надеюсь, это поможет вам: D
person
Gui de Guinetik
schedule
02.10.2013