MultipeerConnectivity会话管理

问题描述:

我真的被困在现在试图在MultipeerConnectivityFramework中掌握邀请。MultipeerConnectivity会话管理

现在我有一个ipad应用充当广告客户和一个iphone应用充当浏览器。 我已经实现了MultipeerFramework一个sharedService,也做了以下内容:

广告

@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"); 
} 

浏览器

- (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上,我可以像在“automaticAdvertiseWithName”方法中看到的那样设置会话。但在iPhone上,我不这样做时,调用“automaticBrowsingWithName”...是这样的问题?他们不一定要成为同一个会话才能成功连接它们吗?我怎样才能成功邀请我的广告客户iPad到浏览器?

当广告客户已经创建新会话时,我感到困惑。

我实际上并不确定,如果代理didReceiveInvitation将对等体添加到connectedPeers中。

- (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”时,即使委托人找到一个属性,根本没有连接的对等体。我在那里犯错了吗?

你的问题是你的session在你调用invitePeer时是空的:toSession:withContext:timeout ...无论如何,你有两个选择来解决这个问题。

你有两个选择:
选项1 - 移动的peerID创建会话创建会议委托指派在其在所有时间执行的地方。例如,在MultiPerConnectivityService类的init代码中,如果它的viewDidLoad中有一个UIViewController。

选项2 - 添加下面的代码片段打电话之前 “invitePeer:toSession:withContext:超时:”

if (!_session) { 
     MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:@"Browser"]; // you can customize the name here 
    _session = [[MCSession alloc] initWithPeer:peerID]; 
    _session.delegate = self; 
} 

希望这有助于...祝你好运!

+0

谢谢!我去了选项2,它工作得很好!会议的概念起初有点难以笼络我的大脑。我一直认为我将不得不使用同一个会话.... – sesc360

+0

很高兴的选项2帮助! – Beuz

+0

我也对此感到困惑。我知道一个浏览器是为了将会话添加到会话中,但我仍然不确定广告客户要做什么。目前,我只是假设广告客户在“inviteHandler”中提供会话时,会以某种方式与浏览器将其添加到的会话“合并”。 @Beuz或@ISARFAKTOR,如果你有这方面的见解,请分享。 – Yazid