2016-03-24 14 views
2

私はこのコードを使用して適切な接続を確立しています。私はiPhone Simulatorと物理デバイスの両方を試しました。正しく接続できませんでした。それは状態を「接続中...」と表示し、そのまま「接続されていません」状態になります。私は多くを探求しており、この問題を解決する有用なものは何も見つかりませんでした。また、アップルデベロッパーフォーラムで、多くの人が同じ問題に直面しているいくつかの質問を読んでいます。しかし、まだ適切な解決策はありません。コードを確認してください。そして、事前に感謝します。MultiPeer Connectivity is not working iOS 9.3 Xcode 7.3

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") 
     } 
    } 
} 

(2台のコンピュータにiPhoneシミュレータを使用しながら)私は、デバイスを見つけたときに広告を停止することにより、いつでも招待ブラウジングを停止することによって、同じプロジェクトのターゲットで、暗号化、暗号化なしと同じように、また、非常に多くの状況を試してみました送信されます。しかし、これらの選択肢のどれもが私の問題を解決しました、それはまだ "Connecting ..."にあり、直接 "Not Connected"に行きます。感想を聞かせてください。

答えて

1

まず、同じWi-Fiネットワークに接続していることを確認します。

しかし、bulutoothがシミュレータで動作しないことを忘れないでください。

また、デバイスとシミュレータは完全に問題ありません。私は数ヶ月間乗算器を使って作業しています。私は接続に気づいた - 両方のデバイス/ピアが異なるwifi/bluetoothネットワークにある場合のみ、切断状態。

これらがすべて正常であれば。次に

read this and get sample projectです。