[英]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.