我现在真的陷入困境,试图掌握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); }
解决方法
您的问题是,当您调用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; }
希望这有帮助,祝你好运!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。