gpt4 book ai didi

IOS7 Multipeer Connectivity 创建带有发现信息的自定义邀请

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:34 28 4
gpt4 key购买 nike

我如何创建自定义邀请以显示来自广告商的发现信息?

这是来 self 的广告客户的代码:

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

最佳答案

我想你搞反了。 IFAIK,MCAdvertiserAssistant 的 discoveryInfo 是广告商为浏览器传递的信息。此信息传递给:

- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info

这是 MCNearbyServiceBrowser 类的委托(delegate)方法。对此:

– browserViewController:shouldPresentNearbyPeer:withDiscoveryInfo:
Which is the delegate for the MCBrowserViewController class.

此信息应用于检查是否应为您的用户显示此广告商。

如果您有兴趣拦截邀请尝试,您应该考虑使用 MCNearbyServiceAdvertiser 类而不是助手。通过这种方式,您可以委托(delegate) 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);
}
}

在 alertview 的 clickedButtonAtIndex 委托(delegate)上,您可以执行如下操作:

- (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. 您的 session 对象应该是一个实例变量,而不是我在某些代码示例中看到的本地变量。根据我的经验,我只是创建了一个静态共享实例来存储 session 对象。如果您想将 session 从一个屏幕传递到另一个屏幕,这也是一个不错的计划。

  2. 请注意,您应该创建一个 NSArray *ArrayInvitationHandler;存储 block 代码的变量。我尝试执行 Block_copy,但出现了一些转换错误,所以 someone在 stackoverflow 中,这里决定存储在一个数组中,我认为这已经足够优雅了。

无论如何,我使用这个设置让它工作。希望对你有帮助:D

关于IOS7 Multipeer Connectivity 创建带有发现信息的自定义邀请,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19123534/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com