简体   繁体   English

多对等连接与进度条对等。

[英]Multipeer Connectivity peer to peer with Progress bar.

I have worked on this for some time now! 我已经为此工作了一段时间! (weeks) Can someone show me where and how to add a Progress or Activity Indicator with a label showing the % complete to a peer to peer connectivity on both the sending and receiving sides. (几周)有人可以告诉我在哪里以及如何添加进度或活动指示器,并带有标签来显示发送方和接收方对等连接的完成百分比。

import UIKit
import MultipeerConnectivity



class ViewController: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate,  UINavigationControllerDelegate , UIImagePickerControllerDelegate{



//MARK: - Variables
var myDictionary:NSDictionary = [:]

//Variables for Peer to Peer.
var browser   : MCBrowserViewController!
var assistant : MCAdvertiserAssistant!
var session   : MCSession!
var peerID    : MCPeerID!

//Variables for Peer to Peer.
let imagePicker  = UIImagePickerController()
var imageDataVar: NSData!



//MARK: - Labels
@IBOutlet weak var firstNameLabel: UILabel!
@IBOutlet weak var lastNameLabel:  UILabel!

//MARK: - TextFields
@IBOutlet weak var fistNameTextField: UITextField!
@IBOutlet weak var lastNameTextField: UITextField!

//MARK: - Outlets

@IBOutlet weak var contactImageView: UIImageView!

//MARK: - Buttons
@IBAction func openPortButton(_ sender: AnyObject) {
self.present(self.browser, animated: true, completion: nil)
}

@IBAction func sendButton(_ sender: AnyObject) {
    sendInfo()
 }

@IBAction func getImage(_ sender: AnyObject) {
    chooseImageContact()
 }


//MARK: - ViewDidLoad
override func viewDidLoad() {
    super.viewDidLoad()
    loadPeerToPeer()
}


//MARK: - Functions
func sendInfo() {
    if self.session.connectedPeers.count > 0 {
        let firstNameVar = fistNameTextField.text!
        let lastNameVar = lastNameTextField.text!
            myDictionary = ["itemA" : "\(firstNameVar)", "itemB" : "\    (lastNameVar)", "itemC" : imageDataVar]
        do {
            let data =  NSKeyedArchiver.archivedData(withRootObject:  myDictionary)
            try self.session.send(data, toPeers:  self.session.connectedPeers, with: MCSessionSendDataMode.unreliable)
        } catch let error as NSError {
            let ac = UIAlertController(title: "Send error", message:     error.localizedDescription, preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default,  handler: nil))
            present(ac, animated: true, completion: nil)
        }
    }
}


// Called when a peer sends an NSData to us
func session(_ session: MCSession, didReceive data: Data, fromPeer  peerID: MCPeerID)  {

// This needs to run on the main queue
DispatchQueue.main.async {
    self.myDictionary = NSKeyedUnarchiver.unarchiveObject(with: data) as! NSDictionary

    self.firstNameLabel.text    = self.myDictionary.value(forKey: "itemA") as? String
    self.lastNameLabel.text     = self.myDictionary.value(forKey: "itemB") as? String
    let image                   = self.myDictionary.value(forKey: "itemC") as? NSData
    let newContactImage:UIImage = UIImage(data: image! as Data)!
    let smallPicture            = self.scaleContactImageWith(newContactImage, newSize: CGSize(width: 100, height: 100))
    var sizeOfImage:CGRect      = self.contactImageView.frame
        sizeOfImage.size        = smallPicture.size
    self.contactImageView.frame = sizeOfImage
    self.contactImageView.image = smallPicture
}
}


func browserViewControllerDidFinish(_ browserViewController:   MCBrowserViewController) {
    dismiss(animated: true, completion: nil)
}
func browserViewControllerWasCancelled(_ browserViewController:   MCBrowserViewController) {
    dismiss(animated: true, completion: nil)
}
func browserViewController(_ browserViewController:   MCBrowserViewController, shouldPresentNearbyPeer peerID: MCPeerID,   withDiscoveryInfo info: [String : String]?) -> Bool {
    return true
}

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

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 session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}



func loadPeerToPeer(){
    self.peerID  = MCPeerID(displayName: UIDevice.current.name)
    self.session = MCSession(peer: peerID, securityIdentity: nil,   encryptionPreference: .required)
    self.session = MCSession(peer: self.peerID)
    self.session.delegate = self
    self.assistant = MCAdvertiserAssistant(serviceType:"VBC-ShareCard",  discoveryInfo:nil, session:self.session)
    self.assistant.start()
    self.browser = MCBrowserViewController(serviceType: "VBC- ShareCard", session: self.session)
    self.browser.delegate = self
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController)  {
    picker.dismiss(animated: true, completion: nil)
}


// Picking the image
func chooseImageContact(){
    let imagePicker            = UIImagePickerController()
        imagePicker.delegate   = self
        imagePicker.sourceType =    UIImagePickerControllerSourceType.photoLibrary
    self.present(imagePicker, animated: true, completion: nil)
}


//Scalling the image
func scaleContactImageWith(_ image:UIImage, newSize:CGSize)->UIImage{
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height:  newSize.height))
    let newContactImage:UIImage =  UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
    return newContactImage
}

func imagePickerController(_ picker: UIImagePickerController,   didFinishPickingMediaWithInfo info: [String : Any]) {

    //This gets the Contact image inside the imagePickerController
    let pickedImage:UIImage     =    info[UIImagePickerControllerOriginalImage] as! UIImage
    let smallPicture            = scaleContactImageWith(pickedImage,   newSize: CGSize(width: 100, height: 100))
    var sizeOfImage:CGRect      = contactImageView.frame
        sizeOfImage.size        = smallPicture.size
        contactImageView.frame  = sizeOfImage
        picker.dismiss(animated: true, completion: nil)
        contactImageView.image  = smallPicture as UIImage
    let test : Data             =  UIImagePNGRepresentation(smallPicture)!
        imageDataVar            = test as NSData!
}

}

You should use the MCSessionDelegate function which you have implemented. 您应该使用已实现的MCSessionDelegate函数。

func session(MCSession, didStartReceivingResourceWithName: String, fromPeer: MCPeerID, with: Progress)

You can use the Progress object to either cancel the transfer or find out how much progress has been made. 您可以使用Progress对象来取消传输或查明已取得多少进展。

Whilst sending data you can use the completion handler of the function used to send data. 在发送数据时,您可以使用用于发送数据的函数的完成处理程序。

func sendResource(at resourceURL: URL, 
     withName resourceName: String, 
       toPeer peerID: MCPeerID, withCompletionHandler completionHandler: ((Error?) -> Void)? = nil) -> Progress?

Again the Progress object can be used to track the progress. 同样,可以使用Progress对象跟踪进度。

On a seperate note, please can you let me know if you have tried using MultipeerConnectivity on iOS 10 and if it works for you. 另外,如果您尝试过在iOS 10上使用MultipeerConnectivity,并且它适用于您,请告诉我。 I've been trying the whole of last week but it is not connecting with the peer. 我在整个上周一直在尝试,但未与同行建立联系。 (Thanks) (谢谢)

Hope this helps. 希望这可以帮助。

Cheers 干杯

My work around. 我的工作。

  //New Variable for spinner.
  var spinnerOnOff = "" 

  //New Function to start, stop, hide and unhide spinner.
  func spin(){
    if spinnerOnOff == "on"{
       activityIndicatorOutlet.isHidden = false
       activityIndicatorOutlet.startAnimating()
    }else{
       activityIndicatorOutlet.isHidden = true
       activityIndicatorOutlet.stopAnimating()
    }
}


//Updated function. (code block will ran "Quickly")
func sendInfo() {
    if self.session.connectedPeers.count > 0 {
        let firstNameVar = fistNameTextField.text!
        let lastNameVar = lastNameTextField.text!
            myDictionary = ["itemA" : "\(firstNameVar)", "itemB" : "\     (lastNameVar)", "itemC" : imageDataVar]
        do {
            let data =  NSKeyedArchiver.archivedData(withRootObject:   myDictionary)
            try self.session.send(data, toPeers:   self.session.connectedPeers, with: MCSessionSendDataMode.unreliable)
        } catch let error as NSError {
            let ac = UIAlertController(title: "Send error", message:        error.localizedDescription, preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default,    handler: nil))
            present(ac, animated: true, completion: nil)
        }
    }

    //New. Stop spinner when function Executes.
    spinnerOnOff = "off"  
    spin()

}

//Updated Function.
func session(_ session: MCSession, didReceive data: Data, fromPeer  peerID: MCPeerID)  {

// This needs to run on the main queue
DispatchQueue.main.async {
    self.myDictionary = NSKeyedUnarchiver.unarchiveObject(with: data) as!   NSDictionary

    self.firstNameLabel.text    = self.myDictionary.value(forKey: "itemA") as? String
    self.lastNameLabel.text     = self.myDictionary.value(forKey: "itemB") as? String
    let image                   = self.myDictionary.value(forKey: "itemC") as? NSData
    let newContactImage:UIImage = UIImage(data: image! as Data)!
    let smallPicture            =    self.scaleContactImageWith(newContactImage, newSize: CGSize(width: 100,  height: 100))
    var sizeOfImage:CGRect      = self.contactImageView.frame
        sizeOfImage.size        = smallPicture.size
    self.contactImageView.frame = sizeOfImage
    self.contactImageView.image = smallPicture

    //New. Stop spinner when data is received.
    self.spinnerOnOff = "off"
    self.spin()

}
}
    //Updated Function
    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {

    switch state {
    case MCSessionState.connected:

        //New. Start spinner on connected phone.
        DispatchQueue.main.async {          
        self.spinnerOnOff = "on"
        self.spin()
        }

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

        //New. Start spinner on sender phone.
        DispatchQueue.main.async {
        self.spinnerOnOff = "on"
        self.spin()
        }

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

        //New. Stop when disconnected.
        DispatchQueue.main.async {
        self.spinnerOnOff = "off"
        self.spin()
        }

        print("Not Connected: \(peerID.displayName)")
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM