Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何使用与我找到的对等方不同的名称邀请对等方参加会话?_Swift_Macos_Multipeer Connectivity - Fatal编程技术网

Swift 如何使用与我找到的对等方不同的名称邀请对等方参加会话?

Swift 如何使用与我找到的对等方不同的名称邀请对等方参加会话?,swift,macos,multipeer-connectivity,Swift,Macos,Multipeer Connectivity,我正在macOS上使用Multipeer连接框架,并尝试实现连接到其他对等方的功能。我使用了一个MCNearbyServiceBrowser,并在NSTableView中显示找到的对等点。我还有一个NSTextField,供人们输入他们的显示名称,这将是他们的mcpeirid的显示名称 工作流程如下:用户输入显示名称,从NSTableView中选择对等点,然后按connect按钮 这意味着在按下connect(连接)按钮之前,我没有MCPERID,因为在此之前,文本字段文本仍可能更改。但是,初

我正在macOS上使用Multipeer连接框架,并尝试实现连接到其他对等方的功能。我使用了一个
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) {}
}