- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 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
,控制台打印出来:
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/
我希望我的 C/C++ 客户端通过 SSL 验证服务器。我首先使用 从服务器下载了证书文件 openssl s_client -showcerts -connect www.openssl.org:4
我正在尝试学习使用 RSelenium。我坚持只是尝试使用 rsDriver 启动服务器。我只是想运行下面的代码并得到以下错误: rD = 8 x64 (build 9200) Matrix prod
我已经建立了一个 8 组织的单 channel 结构网络。我能够进行整个网络设置。但是设置成功后。一些 docker 实例停止监听它们各自的端口。当我做 docker ps -a它显示了一些对等节点图
如何在多个 Azure Kubernetes 集群上的 Pod 之间配置路由? 与 Google Cloud 上的 ip-alias/vpc-native 类似的内容 最佳答案 在 AKS 中,我认为
我正在尝试实现点对点连接应用程序。所以我想将 2 个以上的设备相互连接。如何为每对设备创建单独的 session 使用新的 GameKit 框架是否可以连接到 1 个以上的设备? 最佳答案 您可以使用
我一直致力于创建一个 VPC 对等连接,该连接可以使用 cloudformation 从 eu-west-1 与 us-east-1 进行对等。这是目前的云信息: AWSTemplateFormatV
我正在尝试在两个不同区域之间进行 vpc 对等互连。在这里我已经创建了资源,现在我只想将它们的 id 作为参数传递。在同一区域,我可以在两个 VPC 之间进行对等。但我在两个不同的区域收到错误,因为r
我是一名优秀的程序员,十分优秀!