ios7 - MultipeerConnectivity session 管理

标签 ios7 multipeer-connectivity

我现在真的被困在试图掌握 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。但是我该如何管理邀请?

所以我现在不明白......当我通过浏览器发送邀请时,我必须使用什么 session ?在 iPad 上,我设置了 session ,就像您在“automaticAdvertiseWithName”方法中看到的那样。但是在 iphone 上调用“automaticBrowsingWithName”时我不这样做......这是问题吗?他们不是必须是同一个 session 才能成功连接它们吗?以及如何成功邀请我的广告客户 ipad 访问浏览器?

当广告商已经创建了一个新 session 时,我对创建一个新 session 的概念感到困惑。

实际上,我不确定代表 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);
}

当我在我的 session 中调用属性“connectedPeers”时,根本没有连接的对等点,即使代表找到了一个。我在那里犯错了吗?

最佳答案

您的问题是,在您调用invitePeer:toSession:withContext:timeout 时,您的 session 为空...无论如何,您有两个选项可以解决此问题。

你有两个选择:
选项 1
- 将 peerID 创建、 session 创建和 session 委托(delegate)分配移动到始终执行的位置。例如在 MultipeerConnectivityService 类的初始化代码中,如果它是 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;
}

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

关于ios7 - MultipeerConnectivity session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19742851/

相关文章:

ios - iOS 8中的UITextView文本选择和高亮跳转

ios - UItableView加载数据10 滚动10条记录

iphone - Xcode 5 自动布局 : collection of views inside another view

ios - 使用多点连接接收消息时如何发出声音通知?

ios - 是否可以在没有邀请的情况下连接到 Multipeer Connectivity session ?

ios - 景观应用 Xcode 5/iOS 7

ios - 如何使用协议(protocol)在两个 View Controller 之间传递值

ios - MultipeerConnectivity 在 iOS 14 上无法按预期工作

swift - 使用 SpriteKit 进行多点连接

ios - Swift - MultipeerConnectivity 类型不符合协议(protocol)