Я действительно застрял в данный момент, пытаясь понять суть приглашений в MultipeerConnectivityFramework.MultipeerConnectivity Управление сеансом
Прямо сейчас у меня есть приложение ipad, действующее как рекламодатель и приложение iphone, действующее как браузер. я реализовал sharedService для MultipeerFramework и сделал следующее:
рекламодатель
@implementation MultipeerConnectivityService {
MCNearbyServiceAdvertiser *_advertiser;
MCSession *_session;
MCNearbyServiceBrowser *_browser;
}
- (void)automaticAdvertiseWithName:(NSString *)name {
MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name];
_session = [[MCSession alloc] initWithPeer:peerID];
_session.delegate = self;
_advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID discoveryInfo:nil serviceType:kServiceType];
_advertiser.delegate = self;
[_advertiser startAdvertisingPeer];
}
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
invitationHandler([@YES boolValue], _session);
NSLog(@"Invitation accepted");
}
Browser
- (void)automaticBrowsingWithName:(NSString *)name {
MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name];
_browser = [[MCNearbyServiceBrowser alloc] initWithPeer:peerID serviceType:kServiceType];
_browser.delegate = self;
[_browser startBrowsingForPeers];
}
- (void)browser:(MCNearbyServiceBrowser *)browser didNotStartBrowsingForPeers:(NSError *)error {
if ([_delegate respondsToSelector:@selector(browser:didNotStartBrowsingForPeers:)]) {
[_delegate browserDidNotStartBrowsingForPeers];
}
}
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {
[browser invitePeer:peerID toSession:[self getMCSession] withContext:nil timeout:10];
if ([_delegate respondsToSelector:@selector(browser:foundPeer:)]) {
[_delegate browser:browser foundPeer:peerID];
}
}
- (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID {
if ([_delegate respondsToSelector:@selector(browserLostPeer:)]) {
[_delegate browserLostPeer:peerID];
}
}
- (MCSession *) getMCSession {
return _session;
}
Но тогда я получаю в качестве обратной связи в консоли:
-[MCNearbyServiceBrowser invitePeer:toSession:withContext:timeout:] Bad argument session=nil
Когда я проверяю найденных рекламодателей, все в порядке. Мой рекламодатель ipad находится. Но как я могу управлять приглашением?
Так что я не понимаю это сейчас ... Когда я отправляю приглашение браузером, какую сессию мне нужно использовать? На iPad я настроил сеанс, как вы можете видеть в методе autoAdvertiseWithName. но на iphone я не делаю этого при вызове «automaticBrowsingWithName» ... Это проблема? И разве они не должны быть тем же самым сеансом, чтобы успешно их соединить? И как я могу успешно пригласить своего рекламодателя ipad в браузер?
Меня смущает понятие создания нового сеанса, когда он уже был создан рекламодателем.
На самом деле я не уверен, если делегат didReceiveInvitation добавляет одноранговый узел к подключенным серверам вообще.
- (void)automaticAdvertiseWithName:(NSString *)name {
MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name];
self.session = [[MCSession alloc] initWithPeer:peerID];
self.session.delegate = self;
_advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID discoveryInfo:nil serviceType:kServiceType];
_advertiser.delegate = self;
[_advertiser startAdvertisingPeer];
}
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
BOOL accept = YES;
invitationHandler(accept, self.session);
NSLog(@"Invitation accepted: %@", self.session);
}
И когда я называю свойство «connectedPeers» на моей сессии, нет подключенных сверстники на всех, даже если делегат нашел. Я сделал ошибку там?
Спасибо! Я пошел на вариант 2, и он отлично работает! Концепция сеанса была немного сложна, чтобы сначала обернуть мой мозг. Я всегда думал, что мне придется использовать сеанс SAME для обоих. – sesc360
Рад вариант 2 помог! – Beuz
Я тоже смущен этим. Я знаю, что браузер предназначен для добавления сверстников на его сеанс, но я все еще не уверен, что рекламодатель должен делать по праву. На данный момент я просто предполагаю, что, когда рекламодатель предоставляет сеанс в 'приглашенииHandler', это как-то« сливается »с сеансом, к которому его добавляет браузер. @Beuz или @ISARFAKTOR, если у вас есть идеи, пожалуйста, разделите. – Yazid