gpt4 book ai didi

swift - 我如何使用与我发现该对等人不同的名称邀请对等人加入 session ?

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:53 25 4
gpt4 key购买 nike

我在 macOS 上使用 Multipeer Connectivity Framework,我正在尝试实现连接到其他对等点的功能。我使用了 MCNearbyServiceBrowser 并在 NSTableView 中显示找到的对等点。我还有一个 NSTextField 供人们输入他们的显示名称,这将是他们的 MCPeerID 的显示名称。

工作流程如下:用户输入显示名称,从 NSTableView 中选择一个点,然后按下连接按钮。

enter image description here

这意味着在按下连接按钮之前我没有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,控制台打印出来:

Wrong connection data. Participant ID from remote connection data = 7008A6B3, local participant ID = 4F1F9C8D.

我想这意味着我不能为浏览器和 session 使用不同的 MCPeerID。如果我改变这一行:

session = MCSession(peer: peerID)

到:

session = MCSession(peer: dummyPeerID)

然后就正确连接到session了。


在这种情况下,我在浏览其他对等点时不知道本地对等点的显示名称,我该怎么办? (假设我们无法更改 UI 设计)

最佳答案

我可以想到两种解决方案:使用数据上下文或使用第二个浏览器

使用数据上下文

使用您的虚拟 ID,但不要依赖其 displayName 属性。而是通过 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) {}
}

关于swift - 我如何使用与我发现该对等人不同的名称邀请对等人加入 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57160908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com