由于某些原因,因为我更新后我在使用MultiPeer连接时遇到以下错误,我似乎无法弄清楚:
"类型MessageServiceManager不符合协议MCSession"
一切都过去完美无缺,但现在由于某种原因,一切都被打破了,我不知道为什么。 这是它所有解决的代码:
extension MessageServiceManager : MCSessionDelegate {
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
NSLog("%@", "peer \(peerID) didChangeState: \(state.stringValue())")
self.delegate?.connectedDevicesChanged(self, connectedDevices: session.connectedPeers.map({$0.displayName}))
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
NSLog("%@", "didReceiveData: \(data)")
let str = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
self.delegate?.messageChanged(self, messageString: str)
}
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
NSLog("%@", "didReceiveStream")
}
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL??, withError error: Error?) {
NSLog("%@", "didFinishReceivingResourceWithName")
}
func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
NSLog("%@", "didStartReceivingResourceWithName")
}
}
答案 0 :(得分:3)
你有一个双重问号' ??'其中一种方法。
所以改变这个:
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL??, withError error: Error?) {
NSLog("%@", "didFinishReceivingResourceWithName")
}
到此:
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
NSLog("%@", "didFinishReceivingResourceWithName")
}
请注意删除'?' URL后的字符。
答案 1 :(得分:0)
当提到:
类型MessageServiceManager不符合协议MCSession
这意味着您不您班级中所有必需的方法都符合MCSessionDelegate。
要解决此类问题,您可以按命令并单击MCSessionDelegate
,然后选择"跳转到定义&#34 ;;这应该会引导你:
// Delegate methods for MCSession.
public protocol MCSessionDelegate : NSObjectProtocol {
// Remote peer changed state.
@available(iOS 7.0, *)
public func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState)
// Received data from remote peer.
@available(iOS 7.0, *)
public func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID)
// Received a byte stream from remote peer.
@available(iOS 7.0, *)
public func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID)
// Start receiving a resource from remote peer.
@available(iOS 7.0, *)
public func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress)
// Finished receiving a resource from remote peer and saved the content
// in a temporary location - the app is responsible for moving the file
// to a permanent location within its sandbox.
@available(iOS 7.0, *)
public func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?)
// Made first contact with peer and have identity information about the
// remote peer (certificate may be nil).
@available(iOS 7.0, *)
optional public func session(_ session: MCSession, didReceiveCertificate certificate: [Any]?, fromPeer peerID: MCPeerID, certificateHandler: @escaping (Bool) -> Swift.Void)
}
这是协议的声明。
现在您可以识别您必须实现的方法(所有非可选方法)或方法签名是否匹配;你会注意到:
session(_:didFinishReceivingResourceWithName:fromPeer:at:withError:)
是不是实现的,这就是让编译器抱怨的原因,显然你要做的就是将其实现为:
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
// your logic goes here...
}