ios7 – MultipeerConnectivity会话管理

我现在真的陷入困境,试图掌握MultipeerConnectivityFramework中的邀请.

现在我有一个充当广告商的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”时,即使代理找到了一个,也没有连接的对等体.我在那里弄错了吗?

解决方法

您的问题是,当您调用invitePeer时,您的会话为空:toSession:withContext:timeout …无论如何,您有两个选项来解决此问题.

您有两种选择:
选项1
– 将peerID创建,会话创建和会话委托分配移动到其始终执行的位置.例如,在MultipeerConnectivityService类的init代码中,如果它是viewDidLoad中的UIViewController.
选项2
– 在调用“invitePeer:toSession:withContext:timeout:”之前添加以下代码

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

希望这有帮助,祝你好运!

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...