【发布时间】:2019-07-23 09:25:23
【问题描述】:
我在 macOS 上使用 Multipeer Connectivity Framework,我正在尝试实现连接到其他对等方的功能。我使用了MCNearbyServiceBrowser,并在NSTableView 中显示了找到的对等点。我还有一个NSTextField 供人们输入他们的显示名称,这将是他们的MCPeerID 的显示名称。
工作流程如下:用户输入显示名称,从NSTableView 中选择对等点,然后按下连接按钮。
这意味着在按下连接按钮之前我没有MCPeerID,因为在此之前文本字段文本仍然可以更改。但是,初始化MCNearbyServiceBrowser 需要MCPeerID,所以我想我可以为浏览器使用一个虚拟对等 ID,然后在按下连接按钮时创建一个真实的对等 ID,如下所示:
let dummyPeerID = MCPeerID(displayName: "Unnamed")
override func viewDidLoad() {
browser = MCNearbyServiceBrowser(peer: dummyPeerID, serviceType: "some identifier")
...
}
@IBAction func connect(_ sender: NSButton) {
let peerID = MCPeerID(displayName: displayNameTextField.stringValue)
session = MCSession(peer: peerID)
session.delegate = self
activityIndicator.isHidden = false
activityIndicator.startAnimation(nil)
// selectedTeacher is an RxSwift.Variable<MCPeerID?> that is bound to the selected model object of the table view
browser.invitePeer(selectedTeacher.value!, to: session, withContext: nil, timeout: 10)
}
当我运行这段代码时,我看到 session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) 被调用时使用了 state 或 .notConnected,这会打印在控制台中:
错误的连接数据。远程连接数据中的参与者 ID = 7008A6B3,本地参与者 ID = 4F1F9C8D。
我想这意味着我不能为浏览器和会话使用不同的MCPeerIDs。如果我改变这一行:
session = MCSession(peer: peerID)
到:
session = MCSession(peer: dummyPeerID)
那么它就正确连接到会话了。
在这种情况下,我在浏览其他对等点时不知道本地对等点的显示名称,我该怎么办? (假设我们不能改变 UI 设计)
【问题讨论】:
-
为什么不做类似
if displayNameTextField.stringValue.isEmpty { peerID = dummyPeerID }... -
@l'L'l 你能解释一下这将如何解决问题吗?当文本字段为空时,我有自己的验证检查。我只是禁用连接按钮。我认为我的问题是用于初始化浏览器的 peerID 必须与用于创建会话的 peerID 相同,但是在创建浏览器时,我没有用于创建会话的 peerID ,因为用户尚未输入他的显示名称。
-
好吧,from the documentation 它说“对于本地对等点,您在初始化对象时设置此属性。它无法更改。对于框架提供给您的其他对等对象,此属性是由同行提供,无法更改。”,所以我认为你在这里有一种 22 号陷阱。
-
@l'L'l 是的,我知道是这样的。我希望有人会想出一个聪明的把戏什么的……甚至是使用私有 API。 App Store 拒绝该应用也没关系。
标签: swift macos multipeer-connectivity