我在我的列表中看不到广告商(多点连接),为啥?
Posted
技术标签:
【中文标题】我在我的列表中看不到广告商(多点连接),为啥?【英文标题】:I can not see advertiser (multipeer connectivity) in my list, why?我在我的列表中看不到广告商(多点连接),为什么? 【发布时间】:2014-05-09 10:59:20 【问题描述】:我无法在我的列表中看到广告商。我在设备和模拟器上运行这段代码,你知道为什么吗?
这是添加到主视图控制器的所有代码。我正在使用nshipser multipeer connectivity教程:
- (void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
static NSString * const XXServiceType = @"xx-service";
localPeerID = [[MCPeerID alloc] initWithDisplayName:[[UIDevice currentDevice] name]];
MCNearbyServiceAdvertiser *advertiser =
[[MCNearbyServiceAdvertiser alloc] initWithPeer:localPeerID
discoveryInfo:nil
serviceType:XXServiceType];
advertiser.delegate = self;
[advertiser startAdvertisingPeer];
MCSession *session = [[MCSession alloc] initWithPeer:localPeerID
securityIdentity:nil
encryptionPreference:MCEncryptionNone];
session.delegate = self;
MCNearbyServiceBrowser *browser = [[MCNearbyServiceBrowser alloc] initWithPeer:localPeerID serviceType:XXServiceType];
browser.delegate = self;
MCBrowserViewController *browserViewController =
[[MCBrowserViewController alloc] initWithBrowser:browser
session:session];
browserViewController.view.backgroundColor = [UIColor redColor];
browserViewController.delegate = self;
self.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:browserViewController animated:YES completion:
^
[browser startBrowsingForPeers];
];
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"didReceiveInvitationFromPeer get called" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[av show];
if ([self.mutableBlockedPeers containsObject:peerID])
invitationHandler(NO, nil);
return;
[self.mutableBlockedPeers addObject:peerID];
MCSession *session = [[MCSession alloc] initWithPeer:localPeerID
securityIdentity:nil
encryptionPreference:MCEncryptionNone];
session.delegate = self;
invitationHandler(YES, session);
【问题讨论】:
你收到邀请了吗? 【参考方案1】:代码存在两个主要问题。
首先是您没有对广告客户的任何强引用,因此一旦 viewDidAppear 完成,它将被释放(因此广告停止)。
因此,请确保向视图控制器添加一个属性并将广告客户存储在其中:
@interface ViewController()<MCNearbyServiceAdvertiserDelegate, etc>
@property(nonatomic, strong) MCNearbyServiceAdvertiser *advertiser;
@end
...
- (void)viewDidAppear:(BOOL)animated
... create the advertiser, etc
self.advertiser = advertiser
... etc
第二个问题来自你对浏览器对象的创建和使用。
来自 Apple 的 MCBrowserViewController
类文档:
重要提示:如果想让浏览器视图控制器管理浏览过程,浏览器对象一定不能主动浏览,并且它的delegate必须为nil。
所以,删除browser.delegate = self
的行并删除包含[browser startBrowsingForPeers]
的代码块(而不是传递nil),因为浏览器视图控制器会为您执行此操作。
或者,甚至不直接创建浏览器对象,而是让浏览器视图控制器通过使用其他 init 方法来代替:
MCBrowserViewController *browserViewController = [[MCBrowserViewController alloc] initWithServiceType:XXServiceType session:session];
【讨论】:
我遇到了同样的问题(永远找不到同行)。我添加了对广告商的强烈引用。我已经在使用-[MCBrowserViewController initWithServiceType:session:]
。还会发生什么?
哦,算了...我试图在 Mac 上相互发现 iPhone 和模拟器,但只有 iPhone 连接到 WiFi 网络(Mac 在以太网上)!现在似乎工作了。以上是关于我在我的列表中看不到广告商(多点连接),为啥?的主要内容,如果未能解决你的问题,请参考以下文章