title: DataChannel Webrtc Swift
body: <p>I want to create an data channel. But I'm having some difficulties to implement this. I have added the code that runs on the "caller side":</p>
  
  <pre><code>func initWebRTC() {
          RTCInitializeSSL()
          peerConnectionFactory = RTCPeerConnectionFactory()
  
          let mandatoryConstraints = ["OfferToReceiveAudio": "true", "OfferToReceiveVideo": "false"]
          let optionalConstraints = [ "DtlsSrtpKeyAgreement": "true", "RtpDataChannels" : "true"]
  
  
          mediaConstraints = RTCMediaConstraints.init(mandatoryConstraints: mandatoryConstraints, optionalConstraints: optionalConstraints)
      }
  
  func prepareNewConnection() -&gt; RTCPeerConnection {
          var icsServers: [RTCIceServer] = []
  
          icsServers.append(RTCIceServer(urlStrings: ["stun:stun.l.google.com:19302"], username:"",credential: ""))
  
          let rtcConfig: RTCConfiguration = RTCConfiguration()
          rtcConfig.tcpCandidatePolicy = RTCTcpCandidatePolicy.disabled
          rtcConfig.bundlePolicy = RTCBundlePolicy.maxBundle
          rtcConfig.rtcpMuxPolicy = RTCRtcpMuxPolicy.require
          rtcConfig.iceServers = icsServers;
  
          peerConnection = peerConnectionFactory.peerConnection(with: rtcConfig, constraints: mediaConstraints, delegate: self)
          peerConnection.add(mediaStream);
  
          let tt = RTCDataChannelConfiguration();
          tt.isOrdered = false;
  
          tt.isNegotiated = false
  
          self.dataChannel = peerConnection.dataChannel(forLabel: "datachannel", configuration: tt)
  
          self.dataChannel.delegate = self
          print("create datachannel")
  
          return peerConnection;
      }
  </code></pre>
  
  <p>I create the data channel before the offer as said by many people. 
  This method (see next code) is called several times. The channel state is going from 2 to 3. </p>
  
  <pre><code>public func dataChannelDidChangeState(_ dataChannel: RTCDataChannel){
          print("channel.state \(dataChannel.readyState.rawValue)");
      }
  </code></pre>
  
  <p>But what do I need to do at the receiving side? Because nothing happens there? Do I need to bind the data channel to the receiver? If so, how can I do that? </p>