我正在开发一个应用程序,其中有两个使用MPC的视图控制器,一个用作主机广告,另一个用于选择要连接的其他用户。一旦连接用户准备好继续,它将告诉广告商及其本身继续使用其他视图控制器。但是,尽管我使用的方法与前两个视图控制器中的方法类似,但均能成功工作,但无法在此新视图控制器中成功发送或接收数据,并且没有收到任何错误消息。目标是使一个设备与其他连接的设备共享图像,所有这些设备都在此视图控制器上。这就是我到目前为止所拥有的
import UIKit
import MultipeerConnectivity
class VotingViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
var mcAdvertiserAssistant: MCAdvertiserAssistant!
var peerID: MCPeerID = MCPeerID(displayName: UIDevice.current.name)
var mcSession: MCSession!
var stream: InputStream?
override func viewDidLoad() {
super.viewDidLoad()
mcSession = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required)
mcSession.delegate = self
}
@IBAction func share(_ sender: Any) {
guard let imageToSend = UIImage(named: "Car.png") else { return }
sendImage(img: imageToSend)
}
func sendImage(img: UIImage) {
guard let mcSession = mcSession else { return }
if mcSession.connectedPeers.count > 0 {
if let imageData = img.pngData() {
//here's what to do
do {
try mcSession.send(imageData, toPeers: mcSession.connectedPeers, with: .reliable)
} catch let error as NSError {
let ac = UIAlertController(title: "Send error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
}
}
}
}
// MARK: MCSessionDelegate
extension VotingViewController: MCSessionDelegate {
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
switch state {
case .connected:
DispatchQueue.main.async{
}
case .connecting:
DispatchQueue.main.async{
}
print("Connecting: \(peerID.displayName)")
case .notConnected:
DispatchQueue.main.async{
}
print("Not Connected: \(peerID.displayName)")
@unknown default:
print("Unknown state received: \(peerID.displayName)")
}
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
DispatchQueue.main.async { [weak self] in
if let image = UIImage(data: data) {
self?.imageView.image = image
}
}
}
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
print("Received stream")
stream.delegate = self
stream.schedule(in: RunLoop.main, forMode:RunLoop.Mode.common)
stream.open()
}
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?) {}
}
// MARK: MCAdvertiserAssistantDelegate
extension VotingViewController: MCAdvertiserAssistantDelegate {}
// MARK: StreamDelegate
extension VotingViewController: StreamDelegate {
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
}
}
我仍然对MPC熟悉,所以这可能是一个愚蠢的错误。预先感谢。
答案 0 :(得分:0)
我认为-不要在视图控制器中放置MultipeerConnectivity的实现。 不保证在某些导航后不会释放这些视图控制器。这不是最好的地方。 而是在单独的类中实现它并用作服务。您可以通过单调或appdelegate对其进行管理。