2016-07-01 1 views
0

J'ai récemment construit une application de connectivité multipeer pleinement fonctionnelle et ont eu quelques difficultés à essayer de trouver un moyen de permettre aux utilisateurs de mes changement (ou créer) un personnel Peerid. Le MCBrowserViewController sélectionne les périphériques connectés au même réseau Wi-Fi, mais affiche uniquement le nom de leur périphérique et ne permet pas aux utilisateurs de créer leur propre nom d'utilisateur. Comment est-ce que je devrais aller à ce sujet? J'ai essayé initWithDisplayName() en vain et n'ai trouvé aucune ressource relative à ceci écrit en Swift seulement en Objective-C.Peerid (MCPeerID) personnalisation

import UIKit 
import MultipeerConnectivity 

class ViewController: UIViewController, MCBrowserViewControllerDelegate, MCSessionDelegate { 

let serviceType = "LCOC-Chat" 

var browser : MCBrowserViewController! 
var assistant : MCAdvertiserAssistant! 
var session : MCSession! 
var peerID: MCPeerID! 

@IBOutlet var chatView: UITextView! 
@IBOutlet var messageField: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.peerID = MCPeerID(displayName: UIDevice.currentDevice().name) 
    self.session = MCSession(peer: peerID) 
    self.session.delegate = self 

    // create the browser viewcontroller with a unique service name 
    self.browser = MCBrowserViewController(serviceType:serviceType, 
     session:self.session) 

    self.browser.delegate = self; 

    self.assistant = MCAdvertiserAssistant(serviceType:serviceType, 
     discoveryInfo:nil, session:self.session) 

    // tell the assistant to start advertising our fabulous chat 
    self.assistant.start() 
} 

@IBAction func sendChat(sender: UIButton) { 
    // Bundle up the text in the message field, and send it off to all 
    // connected peers 

    let msg = self.messageField.text.dataUsingEncoding(NSUTF8StringEncoding, 
     allowLossyConversion: false) 

    var error : NSError? 

    self.session.sendData(msg, toPeers: self.session.connectedPeers, 
     withMode: MCSessionSendDataMode.Unreliable, error: &error) 

    if error != nil { 
     print("Error sending data: \(error?.localizedDescription)") 
    } 

    self.updateChat(self.messageField.text, fromPeer: self.peerID) 

    self.messageField.text = "" 
} 

func updateChat(text : String, fromPeer peerID: MCPeerID) { 
    // Appends some text to the chat view 

    // If this peer ID is the local device's peer ID, then show the name 
    // as "Me" 
    var name : String 

    switch peerID { 
    case self.peerID: 
     name = "Me" 
    default: 
     name = peerID.displayName 
    } 

    // Add the name to the message and display it 
    let message = "\(name): \(text)\n" 
    self.chatView.text = self.chatView.text + message 

} 

@IBAction func showBrowser(sender: UIButton) { 
    // Show the browser view controller 
    self.presentViewController(self.browser, animated: true, completion: nil) 
} 

func browserViewControllerDidFinish(
    browserViewController: MCBrowserViewController!) { 
    // Called when the browser view controller is dismissed (ie the Done 
    // button was tapped) 

    self.dismissViewControllerAnimated(true, completion: nil) 
} 

func browserViewControllerWasCancelled(
    browserViewController: MCBrowserViewController!) { 
    // Called when the browser view controller is cancelled 

    self.dismissViewControllerAnimated(true, completion: nil) 
} 

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

    // This needs to run on the main queue 
    dispatch_async(dispatch_get_main_queue()) { 

     var msg = NSString(data: data, encoding: NSUTF8StringEncoding) 

     self.updateChat(msg, fromPeer: peerID) 
    } 
} 

// The following methods do nothing, but the MCSessionDelegate protocol 
// requires that we implement them. 
func session(session: MCSession!, 
    didStartReceivingResourceWithName resourceName: String!, 
    fromPeer peerID: MCPeerID!, withProgress progress: NSProgress!) { 

    // Called when a peer starts sending a file to us 
} 

func session(session: MCSession!, 
    didFinishReceivingResourceWithName resourceName: String!, 
    fromPeer peerID: MCPeerID!, 
    atURL localURL: NSURL!, withError error: NSError!) { 
    // Called when a file has finished transferring from another peer 
} 

func session(session: MCSession!, didReceiveStream stream: NSInputStream!, 
    withName streamName: String!, fromPeer peerID: MCPeerID!) { 
    // Called when a peer establishes a stream with us 
} 

func session(session: MCSession!, peer peerID: MCPeerID!, 
    didChangeState state: MCSessionState) { 
    // Called when a connected peer changes state (for example, goes offline) 

    } 
} 
+0

Pouvez-vous montrer le code où vous créez le MCPeerID local? – Paulw11

+0

@ Paulw11 Je viens de l'ajouter à mon message, laissez-moi savoir si vous avez des commentaires/suggestions concernant ma question. – Alex7

+0

Vous utilisez le nom du périphérique local lorsque vous créez le pair local. Voulez-vous dire que cela ne fonctionne pas lorsque vous utilisez une chaîne différente? Pouvez-vous montrer comment vous avez essayé cela? – Paulw11

Répondre

1

Comme @ paulw11 souligné ci-dessus, la raison pour laquelle les utilisateurs distants voient que le nom du périphérique, est parce que vous passez uniquement le nom du périphérique dans cette ligne de votre code:

self.peerID = MCPeerID(displayName: UIDevice.currentDevice().name) 

Par exemple , si je veux que mon appareil apparaisse comme Xaphod dans le navigateur de quelqu'un d'autre (tableview), puis sur mon appareil, le code doit être:

self.peerID = MCPeerID(displayName: "Xaphod")