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];

person Alaa Awad    schedule 01.10.2013    source источник


Ответы (1)


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

Две важные вещи, которые следует отметить, это то, что:

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

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

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

person Gui de Guinetik    schedule 02.10.2013
comment
Я думаю, что я был сбит с толку, когда писал этот вопрос. На самом деле я искал пользовательский MCBrowserViewController для отображения информации в ближайшем списке одноранговых узлов. Я сделал новый вопрос для этого. stackoverflow.com/questions/19185267/ Но вы определенно ответили на вопрос, который я задал. Спасибо, Гуи! - person Alaa Awad; 04.10.2013