2 Replies
      Latest reply on Sep 4, 2018 4:53 PM by igorland
      igorland Level 1 Level 1 (0 points)

        Hi. I am using Swift's Multipeer Connectivity framework to try to pass data from SKScene:

         

        My AppDelegate class:

         

        class AppDelegate: UIResponder, UIApplicationDelegate
            {
                /// Object to class ConnectionManager
                var connectionManager: ConnectionManager!
           
                var window: UIWindow?
           
           
                func application(_ application: UIApplication,
                                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
                {
                    // Override point for customization after application launch
                    connectionManager = ConnectionManager()
                    return true
                }
            }

         

        This is a subclass of SKScene:

         

         

        class GameScene: SKScene
            {
                /// Object of appDelegate
                let appDelegate = UIApplication.shared.delegate as! AppDelegate
           
                override func touchesEnded(_ touches: Set, with event: UIEvent?)
                {
                    for touch in touches
                    {
                        let location = touch.location(in: self)
                       
                        if let card = atPoint(location) as? Card
                        {
                            // Code to manipulate SKNodes
                        }
                       
                        print("TOUCHES ENDED")
                        // Send Data to Peers
                        appDelegate.connectionManager.sendDataToPeer()
                    }
                }
               
            }

         

        This is the class that manages MPC connection

         

         

        class ConnectionManager : NSObject, MCSessionDelegate, MCNearbyServiceBrowserDelegate, MCNearbyServiceAdvertiserDelegate, StreamDelegate
            {
        
        
                var delegate: ConnectionManagerDelegate?
           
                override init()
                {
                    super.init()
                   
                    // Initialize peerID
                    peer = MCPeerID(displayName: UIDevice.current.name)
                   
                    // Session object
                    session = MCSession(peer: peer, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.optional)
                    session.delegate = self
                   
                    // Browser object
                    browser = MCNearbyServiceBrowser(peer: peer, serviceType: CONNECTION_SERVICE_TYPE)
                    browser.delegate = self
                   
                    // Advertiser object
                    advertiser = MCNearbyServiceAdvertiser(peer: peer,
                                                           discoveryInfo: nil,
                                                           serviceType: CONNECTION_SERVICE_TYPE)
                    advertiser.delegate = self
                }
           
           
                /** State of the session */
                func session(_ session: MCSession,
                             peer peerID: MCPeerID,
                             didChange state: MCSessionState)
                {
                    switch state
                    {
                    case MCSessionState.connected:
                        print("Connected to session: \(session)")
                        delegate?.connectedWithPeer(peerID: peerID)
                        // Start Stream
                        startSession(peer: peerID)
           
                    case MCSessionState.connecting:
                        print("Connecting to session: \(session)")
                       
                    default:
                        print("Did not connect to session: \(session)")
                        stopSession()
                    }
                }
           
           
                /** Starting session */
                func startSession(peer peerID: MCPeerID)
                {
                    print("STARTING STREAM IN SESSION...")
                    do
                    {
                        try outputStream = self.session.startStream(withName: "stream", toPeer: peerID)
           
                        print("OUTPUT STREAM IN STARTSESSION? ",outputStream)
                       
                        if let outputStream = outputStream
                        {
                            outputStream.delegate = self
                            outputStream.schedule(in: RunLoop.main, forMode:RunLoopMode.defaultRunLoopMode)
                            outputStream.open()
                            print("STREAM WITH PEER OPENED: ",peerID)
                        }
                    }
                    catch let error
                    {
                        print("ERROR STARTING STREAM IN SESSION: \(error)")
                    }
                }
           
                /** Sending data to peer */
                func sendDataToPeer()
                {
                   
                    if session.connectedPeers.count > 0
                    {
                        print("SEND DATA TO PEER: MORE THAN ONE PEER")
                       
                        let message = "This is a string test"
                        let data = NSKeyedArchiver.archivedData(withRootObject: message)
                       
                        if let outputStream = outputStream
                        {
                            _ = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) }
                        
                            print("OUTPUTSTREAM FROM SENDING DATA TO PEER")
                        }
                     }
                 }
           
                /** Receiving stream data */
                func session(_ session: MCSession,
                             didReceive stream: InputStream,
                             withName streamName: String,
                             fromPeer peerID: MCPeerID)
                {
                   
                    if streamName == "stream"
                    {
                        stream.delegate = self
                        stream.schedule(in: RunLoop.main, forMode: RunLoopMode.defaultRunLoopMode)
                        stream.open()
                       
                        print("STREAM OPENED: ",streamName)
                    }
                }
           
           
                func stream(aStream: Stream, handleEvent eventCode: Stream.Event)
                {
                    switch(eventCode)
                    {
                        case Stream.Event.hasBytesAvailable:
                        print("--STREAM EVENT HAS BYTES--")
                        let input = aStream as! InputStream
                        var buffer = [UInt8](repeating: 0, count: 1024) //allocate a buffer. The size of the buffer will depended on the size of the data you are sending.
                        let numberBytes = input.read(&buffer, maxLength:1024)
                        let dataString = NSData(bytes: &buffer, length: numberBytes)
                        let message = NSKeyedUnarchiver.unarchiveObject(with: dataString as Data) as! String //deserializing the NSData
                        print("STREAM: ",message)
        
           
                        case Stream.Event.hasSpaceAvailable:
                            print("--STREAM EVENT HAS SPACE AVAILABLE--")
                            break
           
                        default:
                            print("--STREAM EVENT DEFAULT--")
                            break
                    }
                }
            }

         

        So, I have no issues with connection, browsing or advertising. I see that I am connected to the session, then I see: STREAM WITH PEER OPENED... STREAM OPENED. When I manipulate with the SKNodes, I also see: "OUTPUTSTREAM FROM SENDING DATA TO PEER". So, data is being sent and the InputStream is supposedly opened.

         

        However, I do not see anything happening in stream(aStream:, handleEvent eventCode:). Looks like there is no data transferred in the stream.

         

        I would appreciate if someone could help. Thanks!