Swift 如何使用与我找到的对等方不同的名称邀请对等方参加会话?
我正在macOS上使用Multipeer连接框架,并尝试实现连接到其他对等方的功能。我使用了一个Swift 如何使用与我找到的对等方不同的名称邀请对等方参加会话?,swift,macos,multipeer-connectivity,Swift,Macos,Multipeer Connectivity,我正在macOS上使用Multipeer连接框架,并尝试实现连接到其他对等方的功能。我使用了一个MCNearbyServiceBrowser,并在NSTableView中显示找到的对等点。我还有一个NSTextField,供人们输入他们的显示名称,这将是他们的mcpeirid的显示名称 工作流程如下:用户输入显示名称,从NSTableView中选择对等点,然后按connect按钮 这意味着在按下connect(连接)按钮之前,我没有MCPERID,因为在此之前,文本字段文本仍可能更改。但是,初
MCNearbyServiceBrowser
,并在NSTableView
中显示找到的对等点。我还有一个NSTextField
,供人们输入他们的显示名称,这将是他们的mcpeirid
的显示名称
工作流程如下:用户输入显示名称,从NSTableView
中选择对等点,然后按connect按钮
这意味着在按下connect(连接)按钮之前,我没有MCPERID
,因为在此之前,文本字段文本仍可能更改。但是,初始化一个MCNearbyServiceBrowser
需要一个mcpeerind
,因此我想我可以为浏览器使用一个虚拟的对等ID,然后在按下connect按钮时创建一个真实的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)
}
致:
然后它就正确地连接到会话
在这种情况下,当浏览其他对等点时,我不知道本地对等点的显示名称,我该怎么办?(假设我们无法更改UI设计)我可以想出两种解决方案:使用数据上下文或使用第二个浏览器 使用数据上下文 使用虚拟id,但不要依赖其displayName属性。而是通过的上下文参数传递真实的显示名称
使用第二个浏览器 创建一个新的mcpeirid,并使用新的
mcpeirid
创建第二个浏览器。等待,直到使用第二个浏览器再次发现所选教师,然后使用具有新ID的浏览器邀请所选教师
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) {}
}
var dummyBrowser:InvitingBrowser?
@iAction func connect(\发送方:NSButton){
让peerID=mcpeerind(displayName:displayNameTextField.stringValue)
session=MCSession(对等方:peerID)
session.delegate=self
activityIndicator.isHidden=false
活动指示器。开始激活(无)
//selectedTeacher是一个RxSwift.变量,绑定到表视图的选定模型对象
dummyBrowser=邀请浏览器(
会议:会议,
服务类型:mcService,
远程:已选择teacher.value!
)
}
类邀请浏览器:NSObject,MCNearbyServiceBrowserDelegate{
let browser:MCNearbyServiceBrowser
远程变量:mcpherid
让会话:MCSession
初始化(会话:MCSession,服务类型:String,远程:mcpercid){
browser=MCNearbyServiceBrowser(对等:session.myPeerID,serviceType:serviceType)
self.remote=远程
self.session=会话
super.init()
browser.delegate=self
browser.startBrowsingForPeers()
}
func浏览器(browser:McNearByService浏览器,foundPeer peerID:MCPeerID,带DiscoveryInfo:[String:String]?){
如果peerID==远程{
browser.invitePeer(peerID,to:session,withContext:nil,超时:30)
browser.stopBrowsingForPeers()
}
}
func浏览器(browser:MCNearbyServiceBrowser,lostPeer-peerID:MCPeerID){}
}
为什么不执行类似于if displayNameTextField.stringValue.isEmpty{peerID=dummyPeerID}
…@l'l'l的操作?您能解释一下这是如何解决问题的吗?当文本字段为空时,我有自己的验证检查。我只是禁用了连接按钮。我认为我的问题是,用于初始化浏览器的peerID必须与用于创建会话的peerID相同,但在创建浏览器时,我没有用于创建会话的peerID,因为用户尚未输入其显示名称。它说对于本地对等方,您可以在初始化对象时设置此属性。这是无法改变的。对于框架提供给您的其他对等对象,此属性由对等对象提供,不能更改。“,所以我想你在这里遇到了第22个难题。@l'l'l是的,我知道是这样的。我希望有人能想出一个聪明的把戏什么的。。。甚至使用私有API。如果应用程序商店拒绝该应用程序,也可以。
session = MCSession(peer: dummyPeerID)
@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
)
}
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) {}
}