【问题标题】:How can I invite a peer to a session using a different name from the one that I found the peer with?如何使用与我找到对等点的名称不同的名称邀请对等点加入会话?
【发布时间】:2019-07-23 09:25:23
【问题描述】:

我在 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,这会打印在控制台中:

错误的连接数据。远程连接数据中的参与者 ID = 7008A6B3,本地参与者 ID = 4F1F9C8D。

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

session = MCSession(peer: peerID)

到:

session = MCSession(peer: dummyPeerID)

那么它就正确连接到会话了。


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

【问题讨论】:

  • 为什么不做类似if displayNameTextField.stringValue.isEmpty { peerID = dummyPeerID }...
  • @l'L'l 你能解释一下这将如何解决问题吗?当文本字段为空时,我有自己的验证检查。我只是禁用连接按钮。我认为我的问题是用于初始化浏览器的 peerID 必须与用于创建会话的 peerID 相同,但是在创建浏览器时,我没有用于创建会话的 peerID ,因为用户尚未输入他的显示名称。
  • 好吧,from the documentation 它说“对于本地对等点,您在初始化对象时设置此属性。它无法更改。对于框架提供给您的其他对等对象,此属性是由同行提供,无法更改。”,所以我认为你在这里有一种 22 号陷阱。
  • @l'L'l 是的,我知道是这样的。我希望有人会想出一个聪明的把戏什么的……甚至是使用私有 API。 App Store 拒绝该应用也没关系。

标签: swift macos multipeer-connectivity


【解决方案1】:

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

使用数据上下文

使用您的虚拟 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) {}
}

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2021-10-31
    • 2018-12-10
    • 2012-05-02
    • 2016-03-13
    • 2013-11-27
    相关资源
    最近更新 更多