【问题标题】:Multipeer Connectivity With Personal Hotspot Swift个人热点 Swift 的多点连接
【发布时间】:2019-01-14 06:32:41
【问题描述】:

我正在使用 Multipeer 连接。当所有设备都连接到同一个 wifi 时,它可以正常工作。

我有 1 个主设备和 5 个从设备。我想与个人热点进行连接,但每次连接都会被拒绝。 我想使用个人热点将所有从设备与主设备连接以在它们之间共享数据。

这是我的代码:

class SessionManager: NSObject, MCSessionDelegate, MCBrowserViewControllerDelegate, MCNearbyServiceAdvertiserDelegate, MCNearbyServiceBrowserDelegate {

    func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String: String] ? ) {
        browser.invitePeer(peerID, to: mcSession, withContext: nil, timeout: 10)
    }

    func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
        print("Lost Peer")
    }


    static
    let shared = SessionManager()

    var peerID = MCPeerID(displayName: UIDevice.current.name)
    var mcSession: MCSession!
        var mcAdvertiserAssistant: MCAdvertiserAssistant!
            var delegate: SessionDelegate!
                var serviceBrowser: MCNearbyServiceBrowser
    var serviceAdvertiser: MCNearbyServiceAdvertiser

    override init() {
        serviceBrowser = MCNearbyServiceBrowser(peer: peerID, serviceType: "demo")
        serviceAdvertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: "demo")

        super.init()

        peerID = MCPeerID(displayName: UIDevice.current.name)
        mcSession = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required)
        mcSession.delegate = self

        serviceBrowser.delegate = self
        serviceBrowser.startBrowsingForPeers()
        serviceAdvertiser.delegate = self
        serviceAdvertiser.startAdvertisingPeer()

    }


    //MARK: Start Hosting
    func startHosting() {
        mcAdvertiserAssistant = MCAdvertiserAssistant(serviceType: "demo", discoveryInfo: nil, session: mcSession)
        mcAdvertiserAssistant.start()
    }

    //MARK: Join Session
    func joinSession() {
        let mcBrowser = MCBrowserViewController(serviceType: "demo", session: mcSession)
        mcBrowser.delegate = self
        mcBrowser.navigationController ? .navigationBar.backgroundColor = .black
        UINavigationBar.appearance().tintColor = .black
        UIApplication.visibleViewController.present(mcBrowser, animated: true)
    }

    //MARK: Delegate Methods
    func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {}

    func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {}

    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL ? , withError error : Error ? ) {}

    func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
        UIApplication.visibleViewController.dismiss(animated: true, completion: nil)
    }

    func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
        UIApplication.visibleViewController.dismiss(animated: true, completion: nil)

    }

    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
        switch state {
            case MCSessionState.connected:
                print("Connected:SessionManager \(peerID.displayName)")

            case MCSessionState.connecting:
                print("Connecting:SessionManager \(peerID.displayName)")

            case MCSessionState.notConnected:
                print("Not Connected:SessionManager \(peerID.displayName)")
        }
    }

    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
        let sessionData = SessionModel.init(session, peerID, data)
        delegate.didRecieveSessionData(sessionData)
    }

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data ? , invitationHandler : @escaping(Bool, MCSession ? ) - > Void) {
        print("Receive Invitation")
        invitationHandler(true, self.mcSession)
    }
    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {
        print("Ddn't Start")
    }


}

有什么办法可以做到这一点。

任何帮助将不胜感激。

【问题讨论】:

    标签: ios swift xcode multipeer-connectivity


    【解决方案1】:

    之前已经问过(无济于事):Multipeer Connectivity with personal Hotspot not working

    据我所知,MPC 只是不同网络方式之上的一个抽象层。 Apple 使用 M-DNS (Bonjour) 和包括蓝牙在内的其他技术使 macOS / iOS 设备之间的网络尽可能简单。

    多点连接是一种对等解决方案,而您所描述的更多的是一种客户端-服务器解决方案。这并不意味着你不能把它拉下来,但记住这一点是很好的!这意味着您希望 MPC 作为网络的基本级别,并在此基础上实现客户端-服务器结构。我看不出有任何理由说明为什么在将其中一个设备用作热点时这是不可能的,但我认为这甚至不需要:Airdrop 也使用 MCP,并且当设备不在同一个网络中时它也可以工作。

    这方面有一些有价值的资源:

    【讨论】:

    • 您能否提供最新的 x-code 10.1 或 10.0 的相同代码,因为我正在尝试处理您提供的链接。似乎有很多错误和崩溃。
    • 我在去年 10 月 (Swift 4.2) 的讲座中添加了示例,它不完全是您所需要的,但解释了很多关于多点连接的内容,希望对您有所帮助! github.com/jakorten/MPC
    • 感谢您的帮助
    • 我遇到了同样的问题,它根本不是客户端服务器——仅仅因为一台设备提供互联网连接,并不意味着您不想将某些应用程序视为对等应用程序在该网络中,这两个设备之间的对等点......我已经验证确实有效的一件事是两个运行乘法器的设备连接到第三个设备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2017-06-04
    • 1970-01-01
    • 2011-09-05
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多