[英]MultiPeer Connectivity is not working iOS 9.3 Xcode 7.3
我一直在使用此代码来建立正确的连接。 我已经尝试过 iPhone 模拟器和物理设备。 我无法正确连接它。 因为它显示它的状态为“正在连接...”,然后直接进入“未连接”状态。 我已经探索了很多,并没有发现任何有用的东西可以解决这个问题。 此外,我在 Apple Developer Forum 中阅读了一些问题,很多人都遇到过同样的问题。 但目前还没有合适的解决方案。 请检查代码。 并提前致谢。
import UIKit
import MultipeerConnectivity
//MARK: MCNearbyServiceAdvertiserDelegate
extension ViewController : MCNearbyServiceAdvertiserDelegate
{
// Incoming invitation request. Call the invitationHandler block with YES
// and a valid session to connect the inviting peer to the session.
func advertiser(advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: NSData?, invitationHandler: (Bool, MCSession) -> Void)
{
invitationHandler(true, self.session) // Accepting an invitation
// self.serviceBrowser.stopBrowsingForPeers()
}
// Advertising did not start due to an error.
func advertiser(advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: NSError)
{
print("\(error.localizedDescription)")
}
}
//MARK: MCNearbyServiceBrowserDelegate
extension ViewController : MCNearbyServiceBrowserDelegate
{
// Found a nearby advertising peer.
func browser(browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?)
{
browser.invitePeer(peerID, toSession: self.session, withContext: nil, timeout: 10) // Inviting a peer to connect to my session
// self.serviceAdvertiser.stopAdvertisingPeer()
}
// A nearby peer has stopped advertising.
func browser(browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID)
{
print("Lost")
}
// Browsing did not start due to an error.
func browser(browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: NSError)
{
print("\(error.localizedDescription)")
}
}
//MARK: MCSessionDelegate
extension ViewController : MCSessionDelegate
{
// Remote peer changed state.
func session(session: MCSession, peer peerID: MCPeerID, didChangeState 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)")
}
}
// Received data from remote peer.
func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)
{
dispatch_async(dispatch_get_main_queue()) {
let str = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
print("Value recieved : \(str)")
}
}
// Received a byte stream from remote peer.
func session(session: MCSession, didReceiveStream stream: NSInputStream, withName streamName: String, fromPeer peerID: MCPeerID)
{
}
// Start receiving a resource from remote peer.
func session(session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, withProgress progress: NSProgress)
{
}
// 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.
func session(session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, atURL localURL: NSURL, withError error: NSError?)
{
}
// Made first contact with peer and have identity information about the
// remote peer (certificate may be nil).
func session(session: MCSession, didReceiveCertificate certificate: [AnyObject]?, fromPeer peerID: MCPeerID, certificateHandler: (Bool) -> Void)
{
}
}
//MARK: ViewController
class ViewController: UIViewController {
// View Did Load
override func viewDidLoad() {
super.viewDidLoad()
self.start()
}
// User clicked on a button, send value alvin to all connected devices
@IBAction func helloclicked(sender: UIButton)
{
self.sendValuesToPeer("alvin")
}
private enum EHRServiceType : String
{
case Update = "HelloUpdate"
}
var myOwnPeerId : MCPeerID!
// Browser
var advertiserAssistant : MCAdvertiserAssistant!
// For finding the devices
var serviceAdvertiser : MCNearbyServiceAdvertiser!
// For listening to devices
var serviceBrowser : MCNearbyServiceBrowser!
// Session
// var session : MCSession!
lazy var session : MCSession = {
let session = MCSession(peer: self.myOwnPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Optional)
session.delegate = self
return session
}()
func start() {
self.myOwnPeerId = MCPeerID(displayName: "Alvin \(UIDevice.currentDevice().name)")
// Advertising
self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: self.myOwnPeerId, discoveryInfo: nil, serviceType: EHRServiceType.Update.rawValue)
// Browsing
self.serviceBrowser = MCNearbyServiceBrowser(peer: self.myOwnPeerId, serviceType: EHRServiceType.Update.rawValue)
self.advertiserAssistant = MCAdvertiserAssistant(serviceType: EHRServiceType.Update.rawValue, discoveryInfo: nil, session: self.session)
// Session
// self.session = MCSession(peer: self.myOwnPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Required)
// Session
// self.session.delegate = self
// Browsing
self.serviceBrowser.delegate = self
self.serviceBrowser.startBrowsingForPeers() // Starting browsing...
// Avertising
self.serviceAdvertiser.delegate = self
self.serviceAdvertiser.startAdvertisingPeer() // Starting advertising...
self.advertiserAssistant.start()
}
override func viewDidAppear(animated: Bool) {
// let browser = MCBrowserViewController(browser: self.serviceBrowser, session: self.session)
// self.presentViewController(browser, animated: true, completion: nil)
}
//MARK: Send values to peer
func sendValuesToPeer(name : String)
{
if self.session.connectedPeers.count > 0
{
let value = name.dataUsingEncoding(NSUTF8StringEncoding)
do
{
try self.session.sendData(value!, toPeers: self.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable)
}
catch
{
}
}
else
{
print("No peers")
}
}
}
我也尝试过很多情况,比如不加密,加密,具有相同的项目目标(在两台计算机上使用 iPhone 模拟器时),通过在找到设备时停止广告,在发送邀请时停止浏览。 但是这些替代方案都没有解决我的问题,它仍然在“正在连接...”中,直接转到“未连接”。 请让我知道你的想法。
首先检查您是否在同一个wifi网络中。
但不要忘记 bulutooth 在模拟器中不起作用。
此外,设备和模拟器完全没问题。 我正在使用乘数几个月。 我注意到连接 - 只有当两个设备/对等点都在不同的 wifi/蓝牙网络中时才处于断开状态。
如果这些都OK。 然后
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.