Multipler Connectivity fails with Protocols

Hey there.

I've got a problem and don't know how to solve it! I'm trying to use the 'MultipeerConnectivity'-Framework. When I try to implement the MCNearbyServiceAdvertiserDelegate and the MCSessionDelegate I get a failure that my class doesn't conform to these two protocols. And I can't figure out why!? I've implemented all of the needed functions and in an other project the code works without any errors! Here the code (Swift 3, Xcode 8.3.2)


import Foundation
import MultipeerConnectivity
protocol MPCManagerProtocoll {
    func updatedPeerList(manager: MPCManager, devises: [String])
    func recieved(manager: MPCManager, message: String)
}
class MPCManager: NSObject {
   
    private let MPCServiceType = "test-network"
   
    private let myPeerId = MCPeerID(displayName: UIDevice.current.name)
   
    private let serviceAdvertiser : MCNearbyServiceAdvertiser
    private let serviceBrowser : MCNearbyServiceBrowser
    internal var session : MCSession
   
    var delegate : MPCManagerProtocoll?
   
    override init() {
        self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: MPCServiceType)
        self.serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: MPCServiceType)
        self.session = MCSession(peer: self.myPeerId, securityIdentity: nil, encryptionPreference: .required)
       
        super.init()
       
        self.serviceAdvertiser.delegate = self
        self.serviceAdvertiser.startAdvertisingPeer()
       
        self.serviceBrowser.delegate = self
        self.serviceBrowser.startBrowsingForPeers()
       
        self.session.delegate = self
    }
   
    func send(textmessage text: String) {
        if session.connectedPeers.count > 0 {
            do {
                try self.session.send(text.data(using: .utf8)!, toPeers: session.connectedPeers, with: .reliable)
            }
            catch let error {
                NSLog("%@", "Error for sending: \(error)")
            }
        }
       
    }
   
    deinit {
        self.serviceAdvertiser.stopAdvertisingPeer()
        self.serviceBrowser.stopBrowsingForPeers()
    }
   
}
extension MPCManager : MCNearbyServiceAdvertiserDelegate {
   
    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {
        NSLog("%@", "didNotStartAdvertisingPeer: \(error)")
    }
   
    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
        NSLog("%@", "didReceiveInvitationFromPeer \(peerID)")
        invitationHandler(true,self.session)
    }
   
}
extension MPCManager : MCNearbyServiceBrowserDelegate {
   
    func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) {
        NSLog("%@", "didNotStartBrowsingForPeers: \(error)")
    }
   
    func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
        NSLog("%@", "foundPeer: \(peerID)")
        NSLog("%@", "invitePeer: \(peerID)")
        browser.invitePeer(peerID, to: self.session, withContext: nil, timeout: 10)
    }
   
    func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
        NSLog("%@", "lostPeer: \(peerID)")
    }
   
}
extension MPCManager : MCSessionDelegate {
   
    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
        NSLog("%@", "peer \(peerID) didChangeState: \(state)")
        self.delegate?.updatedPeerList(manager: self, devises: session.connectedPeers.map{$0.displayName})
    }
   
    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
        NSLog("%@", "didReceiveData: \(data)")
        let str = String(data: data, encoding: .utf8)!
        self.delegate?.recieved(manager: self, message: str)
    }
   
    func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
        NSLog("%@", "didReceiveStream")
    }
   
    func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
        NSLog("%@", "didStartReceivingResourceWithName")
    }
   
    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL, withError error: Error?) {
        NSLog("%@", "didFinishReceivingResourceWithName")
    }
   
}


Is there someone with the same problem? I'm glad for every idea, getting desperate...

Replies

I created a new test project (Xcode 8.3.2 running on macOS 10.12.4), added an

MPCManager.swift
file, and pasted your code into it. It compiled without any problems.

Try doing that and see what happens. I suspect that this is something specific to your project rather than a problem with your code.

Share and Enjoy

Quinn “The Eskimo!”
Apple Developer Relations, Developer Technical Support, Core OS/Hardware

let myEmail = "eskimo" + "1" + "@apple.com"