iOSMultipeerConnectivity使用

MultipeerConnectivity是iOS7推出的多点连接框架,多用于文件传输,类似于iOS设备的airTrop隔空投放,在没有联网的情况下也能聊天传文件。

使用方法,一个设备作为广播开放PeerID,另一个设备搜索广播的peerID,建立连接相互发送文件

1,首先每个设备都要创建一个PeerID用来标示自己

 // MD1

    lazy var me: MCPeerID = {

        let peer: MCPeerID

            peer = MCPeerID(displayName: UIDevice.current.name)

          return peer

    }()

2.创建连接需要MCSession,设置代理,实现代理方法

    // MD2

    lazy var session: MCSession = {

        let s = MCSession(peer: me, securityIdentity: nil, encryptionPreference: .none)

         s.delegate = self

        return s

    }()

// MD3

extension PeerService: MCSessionDelegate {

 

    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {

        switch state {

        case .connected:

            print("Now connected to \(peerID.displayName)")

            DispatchQueue.main.async {

                self.didConnectToDevice?(peerID.displayName)

            }

        case .connecting:

            print("Connecting to \(peerID.displayName)")

        case .notConnected:

            print("NOT connected to \(peerID.displayName)")

        }

    }

 

    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {

 

    }

 

    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) {

        NSLog("Started resource download: \(resourceName)")

    }

 

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

        NSLog("Finished resource download: \(resourceName)")

 

        // MD12

        guard let url = localURL else { return }

 

        DispatchQueue.main.async {

            self.didReceiveFile?(url)

        }

    }

 

}

3广播peerID

  // MD4

    lazy var advertiser: MCNearbyServiceAdvertiser = {

        let a = MCNearbyServiceAdvertiser(peer: me, discoveryInfo: ["demo": "data"], serviceType: "MultipeerDemo")

 

        a.delegate = self

 

        return a

    }()

    func startAdvertising() {

        // MD6

        advertiser.startAdvertisingPeer()

    }

4实现广播ID的代理方法

// MD5

extension PeerService: MCNearbyServiceAdvertiserDelegate {

 

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {

        // This is insecure! We should verify that the peer is valid and etc etc

        invitationHandler(true, session)    //确认连接,把session赋给它

    }

 

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {

        NSLog("Woops! Advertising failed with error \(String(describing: error))")

    }

 

}

5.作为搜索的peerID要创建browser实现代理方法

// MD7

    lazy var browser: MCNearbyServiceBrowser = {

        let b = MCNearbyServiceBrowser(peer: me, serviceType: "MultipeerDemo")

 

        b.delegate = self

 

        return b

    }()

     func startListening() {//开始搜索

        // MD9

        browser.startBrowsingForPeers()

    }

// MD8

extension PeerService: MCNearbyServiceBrowserDelegate {

 

    func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {

      //搜到了peerID可以放入熟组中,选择想要连接的peerID连接,这里直接连接

browser.invitePeer(peer, to: session, withContext: nil, timeout: 10)

    }

 

    func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {

        NSLog("Puke")

    }

 

}

 //发送图片

    func sendPicture(with data: Data, completion: @escaping (Error?) -> Void) {

        // MD11

        guard let peer = session.connectedPeers.last else {

            NSLog("No connected peers to send to")

            return

        }

 

        guard let baseURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else {

            fatalError("No caches directory. WHAT?!")

        }

 

        let filename = UUID().uuidString + ".png"

 

        let fileURL = baseURL.appendingPathComponent(filename)

 

        do {

            try data.write(to: fileURL, options: .atomicWrite)

 

            session.sendResource(at: fileURL,

                                 withName: filename,

                                 toPeer: peer,

                                 withCompletionHandler: completion)

        } catch {

            completion(error)

        }

    }

//发送字符串data

        let srt = "hello"

        if let data = srt.data(using: .utf8){

           try! session.send(data, toPeers: [peerID], with: .reliable)

        }

接收到数据后进行相应的处理得到想要的数据

 

转载于:https://www.cnblogs.com/duzhaoquan/p/10375005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MultipeerConnectivity 框架是苹果提供的一种用于在 iOS 设备之间进行点对点通信的框架,它可以支持 Wi-Fi 或蓝牙连接方式来实现设备之间的数据传输。在这个框架中,可以使用 MCSession 类来创建一个会话,然后在会话中添加想要连接的设备,从而实现点对点通信。以下是一个使用 MultipeerConnectivity 框架实现组播与数据发送和接收数据的示例代码: 1. 导入框架 在头文件中导入 MultipeerConnectivity 框架: ``` #import <MultipeerConnectivity/MultipeerConnectivity.h> ``` 2. 创建会话 使用 MCSession 类创建一个会话,指定会话的代理为当前类: ``` @property (nonatomic, strong) MCSession *session; - (void)viewDidLoad { [super viewDidLoad]; self.session = [[MCSession alloc] initWithPeer:[[MCPeerID alloc] initWithDisplayName:@"MyDevice"]]; self.session.delegate = self; } ``` 3. 添加设备 将要连接的设备添加到会话中: ``` - (void)searchForDevices { MCBrowserViewController *browserVC = [[MCBrowserViewController alloc] initWithServiceType:@"myservice" session:self.session]; browserVC.delegate = self; [self presentViewController:browserVC animated:YES completion:nil]; } - (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController { [browserViewController dismissViewControllerAnimated:YES completion:nil]; } - (void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController { [browserViewController dismissViewControllerAnimated:YES completion:nil]; } ``` 4. 发送数据 使用 MCSession 类的 sendData:toPeers:withMode:error: 方法来发送数据: ``` - (IBAction)sendData:(id)sender { NSData *data = [@"Hello, world!" dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; [self.session sendData:data toPeers:self.session.connectedPeers withMode:MCSessionSendDataReliable error:&error]; if (error) { NSLog(@"Error sending data: %@", error); } } ``` 5. 接收数据 在 MCSessionDelegate 协议方法中实现接收数据的逻辑: ``` - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID { NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"Received message: %@", message); } ``` 以上就是使用 MultipeerConnectivity 框架实现组播与数据发送和接收数据的示例代码。需要注意的是,这个示例中使用的是可靠传输模式(MCSessionSendDataReliable),也可以使用不可靠传输模式(MCSessionSendDataUnreliable)来提高传输效率,但是会存在数据丢失的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值