我如何使用与我发现该对等人不同的名称邀请对等人加入会话?
How can I invite a peer to a session using a different name from the one that I found the peer with?
我在 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)
是用 .notConnected
的 state
调用的,这在控制台中打印:
Wrong connection data. Participant ID from remote connection data = 7008A6B3, local participant ID = 4F1F9C8D.
我想这意味着我不能对浏览器和会话使用不同的 MCPeerID
。如果我更改此行:
session = MCSession(peer: peerID)
至:
session = MCSession(peer: dummyPeerID)
然后正确连接到会话。
在这种情况下,我在浏览其他点时不知道本地点的显示名称,我该怎么办? (假设我们无法更改 UI 设计)
我可以想到两个解决方案:使用数据上下文或使用第二个浏览器
使用数据上下文
使用您的虚拟 ID,但不要依赖其显示名称 属性。而是通过 invitePeer(_ peerID: MCPeerID, to session: MCSession, withContext context: Data?, timeout: TimeInterval)
的上下文参数传递您的真实显示名称
@IBAction func connect(_ sender: NSButton) {
session = MCSession(peer: dummyPeerID)
session.delegate = self
activityIndicator.isHidden = false
activityIndicator.startAnimation(nil)
browser.invitePeer(
selectedTeacher.value!,
to: session,
withContext: displayNameTextField.stringValue.data(using: .utf8)!,
timeout: 10
)
}
使用第二个浏览器
创建一个新的 MCPeerID 并使用您的新 MCPeerID
创建第二个浏览器。等到使用第二个浏览器再次发现 selectedTeacher,然后使用具有新 ID 的浏览器邀请 selectedTeacher。
var dummyBrowser: InvitingBrowser?
@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
dummyBrowser = InvitingBrowser(
session: session,
serviceType: mcService,
remote: selectedTeacher.value!
)
}
class InvitingBrowser: NSObject, MCNearbyServiceBrowserDelegate {
let browser: MCNearbyServiceBrowser
var remote: MCPeerID
let session: MCSession
init(session: MCSession, serviceType: String, remote: MCPeerID) {
browser = MCNearbyServiceBrowser(peer: session.myPeerID, serviceType: serviceType)
self.remote = remote
self.session = session
super.init()
browser.delegate = self
browser.startBrowsingForPeers()
}
func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
if peerID == remote {
browser.invitePeer(peerID, to: session, withContext: nil, timeout: 30)
browser.stopBrowsingForPeers()
}
}
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {}
}
我在 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)
是用 .notConnected
的 state
调用的,这在控制台中打印:
Wrong connection data. Participant ID from remote connection data = 7008A6B3, local participant ID = 4F1F9C8D.
我想这意味着我不能对浏览器和会话使用不同的 MCPeerID
。如果我更改此行:
session = MCSession(peer: peerID)
至:
session = MCSession(peer: dummyPeerID)
然后正确连接到会话。
在这种情况下,我在浏览其他点时不知道本地点的显示名称,我该怎么办? (假设我们无法更改 UI 设计)
我可以想到两个解决方案:使用数据上下文或使用第二个浏览器
使用数据上下文
使用您的虚拟 ID,但不要依赖其显示名称 属性。而是通过 invitePeer(_ peerID: MCPeerID, to session: MCSession, withContext context: Data?, timeout: TimeInterval)
@IBAction func connect(_ sender: NSButton) {
session = MCSession(peer: dummyPeerID)
session.delegate = self
activityIndicator.isHidden = false
activityIndicator.startAnimation(nil)
browser.invitePeer(
selectedTeacher.value!,
to: session,
withContext: displayNameTextField.stringValue.data(using: .utf8)!,
timeout: 10
)
}
使用第二个浏览器
创建一个新的 MCPeerID 并使用您的新 MCPeerID
创建第二个浏览器。等到使用第二个浏览器再次发现 selectedTeacher,然后使用具有新 ID 的浏览器邀请 selectedTeacher。
var dummyBrowser: InvitingBrowser?
@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
dummyBrowser = InvitingBrowser(
session: session,
serviceType: mcService,
remote: selectedTeacher.value!
)
}
class InvitingBrowser: NSObject, MCNearbyServiceBrowserDelegate {
let browser: MCNearbyServiceBrowser
var remote: MCPeerID
let session: MCSession
init(session: MCSession, serviceType: String, remote: MCPeerID) {
browser = MCNearbyServiceBrowser(peer: session.myPeerID, serviceType: serviceType)
self.remote = remote
self.session = session
super.init()
browser.delegate = self
browser.startBrowsingForPeers()
}
func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
if peerID == remote {
browser.invitePeer(peerID, to: session, withContext: nil, timeout: 30)
browser.stopBrowsingForPeers()
}
}
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {}
}