邀请同行参加 MCSEssion
Posted
技术标签:
【中文标题】邀请同行参加 MCSEssion【英文标题】:Inviting Peer to MCSEssion 【发布时间】:2015-10-09 19:18:02 【问题描述】:这是我第一次在 *** 上发帖,我知道严格的发帖要求。如果我没有遵循任何准则,请告诉我。
我目前正在使用 Objective-C 在 Xcode 中编写一个 ios (8.4) 应用程序。目标是使用 MCSessions 在 IOS 设备之间传输数据。尽管在这里和其他地方阅读了许多试图澄清该主题的帖子,但我目前仍在为会话的概念而苦苦挣扎。以下是我已经知道的资源:
https://developer.apple.com/videos/play/wwdc2013-708/
https://medium.com/@phoenixy/using-multipeer-connectivity-120abacb9db
这是我目前的理解:在最基本的层面上,您有一个广告客户和一个浏览器。广告商有一个本地会话,允许他们“做广告”。当浏览器看到广告商时,浏览器会向广告商发送邀请到他(浏览器的)本地 MCSession。假设这一切都是正确的,这就是我感到困惑的地方。广告商可以接受邀请,并在此过程中将他的本地会话传递给invitationHandler。
我在代码中实现了如下逻辑,如下图。但是,在跟踪广告商和浏览器的 MCSession 状态更改时,会尝试建立连接,但最终状态始终是 didNotNonnect。
发送邀请码(浏览器):
[self.broadcasterBrowser invitePeer:[broadcasterPeerIDs objectAtIndex:indexPath.row]
toSession: self.appDelegate.mpcHandler.session withContext:nil timeout:30.0 ];
接受邀请的代码(广告商):
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
ArrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]];
// ask the user
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:peerID.displayName
message:@"Would like to create a session with you"
delegate:self
cancelButtonTitle:@"Decline"
otherButtonTitles:@"Accept", nil];
[alertView show];
if (alertViewResult)
void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];
invitationHandler(YES, self.appDelegate.mpcHandler.session);
非常感谢任何帮助!
奥斯汀
【问题讨论】:
【参考方案1】:我在尝试使用 MPC 时遇到了类似的问题。我创建了一个自定义类来处理所有 MPC 连接细节。但是在测试时,每次我的广告商接受邀请时,它都会抱怨连接数据错误并失败。我发现问题在于我正在从我创建的类变量中为我的设备出售 MCPeerID 对象,如下所示:
static var peerObject : MCPeerID
return MCPeerID(displayName: deviceNameString)
lazy var sessionIVar = MCSession (peer: MyConnectivityClass.peerObject)
func startAdvertisingForConnectivity ()
advertiserService = MCNearbyServiceAdvertiser (peer: MyConnectivityClass.peerObject, discoveryInfo: nil, serviceType: "my-multipeer-connectivity-service-identifier")
然后,当我收到邀请时,我会使用“peerObject”计算属性初始化一个 MCSession 对象,并将其返回到邀请处理程序中,如下所示:
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Swift.Void)
invitationHandler(true, sessionIVar)
我假设每次调用“MyConnectivityClass.peerObject”时,它都会返回一个相同的 peerID,因为我总是使用相同的显示名称对其进行初始化。事实证明这不是真的。所以当我做广告时,我使用了一个 peerID 对象,然后当我响应邀请时,我使用了一个包含完全不同 peerID 的 MCSession 对象。
所以解决方案是在我的连接处理程序类中将“MyConnectivityClass.peerObject”计算类属性更改为常量或 Ivar。像这样:
let peerObject : MCPeerID = MCPeerID(displayName: deviceNameString)
然后剩下的代码就可以正常工作了,因为无论我调用 MCPeerID 对象多少次,它总是一样的。回想起来,我不知道为什么我一开始就是这样。 :-)
然后,在我的连接类中,我为浏览器和广告商归档并存储了 MCPeerID 对象,这样我就可以让广告商自动接受可信 MCPeerID 的邀请。如果您每次使用 MCPeerID 对象时都创建它,则这是不可能的,即使您总是使用相同的 DisplayName 对其进行初始化。
【讨论】:
以上是关于邀请同行参加 MCSEssion的主要内容,如果未能解决你的问题,请参考以下文章
通过通知邀请用户参加活动 - 手动工作,但不使用 Graph API