如果用户“始终允许”麦克风访问,Twilio WebRTC客户端会中断?

时间:2016-01-25 17:46:09

标签: twilio

我正在尝试使用“代理”方面的Twilio WebRTC客户端构建呼叫中心应用程序。

目前处于演示阶段,但我遇到了一个主要问题,它似乎是浏览器的WebRTC堆栈或Twilio的客户端代码中的错误。如果永久允许从浏览器访问麦克风(这是Chrome中默认的“允许”行为,并且在Firefox中可能是这种情况),那么第一次通话就会很好,但是当第二次通话被路由到客户端时,请回答它打破了一切。

在Chrome中,例如(在PC和Mac上测试,使用当前的最新版本,48),第一个通过的调用工作正常(我已经允许麦克风用于此主机,并且它正在运行根据需要使用HTTPS):

[Device] Setting up PStream
twilio.min.js:58 [WSTransport] Opening socket
twilio.min.js:58 [WSTransport] attempting to connect
twilio.min.js:58 [Device] Registering to eventStream with url: wss://matrix.twilio.com/2012-02-09/ACbf0c1cb8b610edf31aa7929d1105895a/32906…M5OSJ9.q_G8AEsidiWelamCLuEhKg7dL1hMtioZgK_gNsY61fs&feature=publishPresence
twilio.min.js:58 [Matrix] Attempting to connect to wss://matrix.twilio.com/2012-02-09/ACbf0c1cb8b610edf31aa7929d1105895a/32906…M5OSJ9.q_G8AEsidiWelamCLuEhKg7dL1hMtioZgK_gNsY61fs&feature=publishPresence...
twilio.min.js:58 [WSTransport] Socket opened
twilio.min.js:58 [PStream] Setting token and publishing listen
twilio.min.js:58 [Matrix] Socket opened... sending ready signal
twilio.min.js:58 [Device] Stream is ready
client:49 Ready
twilio.min.js:58 [Twilio.PeerConnection] signalingState is "have-remote-offer"
twilio.min.js:58 [Twilio.PeerConnection] signalingState is "stable"
client:64 Successfully established call
twilio.min.js:58 [Twilio.PeerConnection] iceConnectionState is "checking"
twilio.min.js:58 [Twilio.PeerConnection] iceConnectionState is "connected"
twilio.min.js:58 [Connection] Received HANGUP from gateway
twilio.min.js:58 [Connection] Disconnecting...
client:69 Call ended
twilio.min.js:58 [Twilio.PeerConnection] iceConnectionState is "closed"
twilio.min.js:58 [Twilio.PeerConnection] signalingState is "closed"

然后,当我第二次调用它时,最初“传入”处理程序被称为OK,它会以铃声等警告,但是当我调用Connection.accept()时,会发生以下情况:

twilio.min.js:58 [Twilio.PeerConnection] signalingState is "have-remote-offer"
twilio.min.js:58 [Twilio.PeerConnection] signalingState is "stable"
client:64 Successfully established call
twilio.min.js:58 [Connection] Received an error from MediaStream:
twilio.min.js:58 Object {info: Object}
client:60 Error: Error creating the answer: Failed to set local answer sdp: Called in wrong state: STATE_INPROGRESS
twilio.min.js:58 [Connection] Received HANGUP from gateway
twilio.min.js:58 [Connection] Received an error from the gateway:
twilio.min.js:58 Object {code: 31000, message: "Call is no longer valid", connection: a}
client:60 Error: Call is no longer valid
twilio.min.js:58 [Connection] Disconnecting...
twilio.min.js:58 [Twilio.PeerConnection] iceConnectionState is "closed"
twilio.min.js:58 [Twilio.PeerConnection] signalingState is "closed"

当发生这种情况时,Chrome中的标签上仍有红色圆圈“记录灯”,当您将鼠标悬停在“此标签正在使用您的相机或麦克风”上时。 Twilio.Device的状态仍然“忙碌”,拨入的电话仍在响铃。

Twilio在其快速入门页面上提供的演示代码会出现这种情况,因此我对如何处理有点不知所措?

在Chrome中,由于无法轻松打开和关闭麦克风访问,因此很难看到发生了什么。在Firefox中,如果您“始终允许”麦克风,则会发生相同的行为,但如果您单击地址栏上的麦克风图标并删除权限,那么当您再次呼叫并要求时,只要您说“接受一次” “一切都很好。

显然,呼叫中心每次想要接听电话时都必须接受访问权限 - 任何想法如何解决?

有一种可能的解决方法是在每次呼叫结束时放弃Twilio连接并重新获取,但它远非理想(我还没有测试过它是否有效)。

编辑:

支持页面测试显示以下内容(所有测试通过OK):

User agent: Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_11_2%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F48.0.2564.82+Safari%2F537.36
Javascript: OK (version 1.6)
Browser Version: OK (chrome 48.0.2564.82)
Adobe Flash Version: OK (Shockwave Flash 20.0 r0)
[Device] Setting up PStream
[WSTransport] Opening socket
[WSTransport] attempting to connect
[Device] Destroyed eventstream.
Microphone: OK ( )
[WSTransport] Socket opened
[PStream] Setting token and publishing listen
[Device] Stream is ready
Twilio Client: OK (Device.ready)
[Twilio.PeerConnection] signalingState is "have-local-offer"
[Twilio.PeerConnection] signalingState is "stable"
Twilio Client: OK (Device.connect)
[Twilio.PeerConnection] iceConnectionState is "checking"
[Twilio.PeerConnection] iceConnectionState is "completed"
[Twilio.PeerConnection] iceConnectionState is "completed"

但我认为这是预期的 - 第二次尝试连接到客户端时会出现问题:(

更新:

与Twilio的支持相当多,它是客户端中可重现的错误,所以必须等到他们修复它。一种解决方法是在传入事件中自动应答呼叫,并在其他地方管理您的呼叫处理。

4 个答案:

答案 0 :(得分:1)

这听起来像是JS SDK错误。打开chrome:// webrtc-internals并在重现错误时保持打开状态。

检查您的第一个电话是否正常建立。您应该看到一个带有[someprocessid-1]的内部选项卡,当单击它时,应该在左侧显示一系列事件,如setRemoteDescription,createAnswer,setLocalDescription。最后一件事应该是iceConnectionStateChange。

现在进行第二次通话。您应该看到第二个选项卡[someprocessid-2](单击它,直到它为绿色),显示另一系列事件,setRemoteDescription和createAnswer。通常该选项卡还应显示setLocalDescription,但我怀疑这发生在错误的连接上。检查-1选项卡是否有setLocalDescription,然后是setLocalDescriptionOnFailure。

如果发生这种情况,则SDK中的时间错误不会将API调用分派给正确的RTCPeerConnection对象。

chrome:// webrtc-internals还可以导出这些调用的转储文件,这对调试此类问题非常有用。

答案 1 :(得分:1)

如果您可以与我们分享您的代码,那将有所帮助。但是,下面是我处理客户端调用的方式。

我目前有一个呼叫中心并使用twilio客户端。

听起来好像是在呼叫断开你未关闭浏览器中的呼叫状态

我也在使用socket.io。我有一个回叫路由,当呼叫断开时调用。

然后我打电话给

socket.on('callback', function(data){
        if(data == agent){
          inboundCallType = null;
          inboundCall = undefined;
          Twilio.Device.disconnectAll();
        }
      })

基本上在服务器端,我查找呼叫SID并找出该呼叫上的代理。然后我将代理登录名发送到前端。然后,正在通话的座席将获得disconnectAll提示。将inboundcalltype和inbound调用设置为null适用于我跟踪的自定义变量

当接听电话时,我设置了

inboundCall = Twilio.Device.connect(params);

如果你看这里,你可以在PHP中看到他们如何设置客户端和结束呼叫的完整参考。虽然它是在PHP中,客户端的代码是用JavaScript。

https://www.twilio.com/docs/tutorials/walkthrough/browser-calls/php/laravel

答案 2 :(得分:1)

答案是Twilio Client中的一个错误是他们正在修复 - 但只有在传入事件后使用answer()调用才会发生 - 所以如果你自动接听电话,那么管理其他方式,一切都很好。

答案 3 :(得分:0)

Pete,来自Twilio的Megan。

我假设您正在使用此quickstart

不幸的是,您收到的此错误并不是特别有用,因为代码中有多个位置可能会引发此错误。获取更多信息会很有帮助,例如客户是否正在接听来电或拨打电话?虽然你不想在这里分享它们,但看看call SIDs会很有帮助。

了解您是否使用USB耳机也很有用。

鉴于交换了帐户敏感信息,最好向help@twilio.com寻求建议。

希望这有帮助。