2013-10-01 2 views
3

Как создать пользовательское приглашение, которое отобразит идентификатор discoveryInfo от рекламодателя?IOS7 Multipeer Connectivity Создание пользовательского приглашения с информацией об обнаружении

Вот код от рекламодателя:

// create Discovery Info 
NSArray *objects=[[NSArray alloc] initWithObjects:@"datguy",@"28", nil]; 
NSArray *keys = [[NSArray alloc] initWithObjects:@"Name",@"Age", nil]; 
self.dictionaryInfo = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; 

// Setup Advertiser 
self.advertiser = [[MCAdvertiserAssistant alloc] initWithServiceType:@"txt_msg_service" discoveryInfo:self.dictionaryInfo session:self.advertiseSession]; 
[self.advertiser start]; 

ответ

4

я думаю, что вы получили его назад. 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); 
} 

Два важных вещей, чтобы заметить заключается в том, что:

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

  2. Обратите внимание, что вы должны создать NSArray * ArrayInvitationHandler; переменной для сохранения блочного кода. Я попытался сделать Block_copy, но у него были некоторые ошибки преобразования, поэтому someone здесь, в stackoverflow, решили хранить в массиве, который, по моему мнению, достаточно изящный.

В любом случае, я получил эту работу, используя эту настройку. Надеюсь, это вам поможет: D

+0

Думаю, я был смущен, когда я написал этот вопрос. Я действительно искал пользовательский MCBrowserViewController для отображения информации в ближайшем списке сверстников. Я задал новый вопрос. http://stackoverflow.com/questions/19185267/ios7-multipeer-connectivity-creating-custom-nearby-browser-list-using-advertiser Но вы определенно ответили на вопрос, который я задал. Спасибо, Gui! –

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

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