【发布时间】:2016-07-01 23:57:28
【问题描述】:
我最近构建了一个功能齐全的多人连接应用程序,但在试图找到一种方法让我的用户更改(或创建)个人 peerId 时遇到了一些麻烦. MCBrowserViewController 会选择连接到同一 wifi 网络的设备,但仅显示其设备名称,并且不允许用户创建自己的用户名。我应该怎么做最好?我试过 initWithDisplayName() 无济于事,并且没有发现与此相关的资源,仅在 Objective-C 中用 Swift 编写。
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)
}
}
【问题讨论】:
-
你能显示你在哪里创建本地 MCPeerID 的代码吗?
-
@Paulw11 刚刚将其添加到我的帖子中,如果您有任何与我的问题有关的 cmets/建议,请告诉我。
-
您在创建本地对等体时使用的是本地设备名称。你是说当你使用不同的字符串时它不起作用?你能展示一下你是如何尝试的吗?
-
我已经尝试过了,但还没有真正找到解决办法。老实说,不知道该怎么做。 @Paulw11
-
我使用 `MCPeerID(displayName:"AnyStringYouWant")` 没有任何问题,虽然我没有使用
MCBrowserViewController我只是使用表格视图编写了自己的
标签: ios iphone swift bluetooth multipeer-connectivity