3

Angular アプリで Twilio を使用しています。ユーザーが特定の顧客に電話できるように、ユーザーが特定のページ (顧客ページと呼びましょう) にアクセスするたびに Twilio デバイスを初期化しています。この初期化関数は、顧客コントローラーで呼び出されます。

function _initializeDevice(token, connectHandler, disconnectHandler) {
    console.log('CALLED INITIALIZE DEVICE');
    var device = Twilio.Device;
    device.setup(token, {debug: true});
    console.log(device);

    device.connect(connectHandler);
    device.disconnect(disconnectHandler);

    device.offline(function() {
        _getToken().then(function(result) {
            device.setup(result.data.token, {debug: true});
        });
    });

    device.error(_handleTwilioError);
}

そして、これは上記で渡される切断ハンドラーです。

function onDisconnect() {
    console.log('SAVING CALL');
    // code to save call
}

問題は、ユーザーが顧客ページから移動して戻ってくるたびに (ページを更新せずに)、顧客コントローラーが再度実行され、_initializeDevice関数も再度実行されることです。複数の接続/切断/など。ハンドラーは同じデバイスに登録されることになり、一度だけ実行する必要があるものが複数回実行されます。

問題を説明するためのコンソールログのサンプルを次に示します...

したがって、最初に顧客ページにアクセスして最初に電話をかけると、次のようになります_initializeDevice

CALLED INITIALIZE DEVICE
[Device] Setting up PStream
[WSTransport] Opening socket
[WSTransport] attempting to connect
[WSTransport] Socket opened
[PStream] Setting token and publishing listen
[Device] Stream is ready
[Device] Found existing Device; using new token but ignoring options
[PStream] Setting token and publishing listen
[Twilio.PeerConnection] signalingState is "have-local-offer"
[Twilio.PeerConnection] signalingState is "stable"
[Twilio.PeerConnection] iceConnectionState is "checking"
[Twilio.PeerConnection] iceConnectionState is "connected"
[Twilio.PeerConnection] iceConnectionState is "completed"
[Connection] Disconnecting...
[Twilio.PeerConnection] iceConnectionState is "closed"
[Twilio.PeerConnection] signalingState is "closed"
SAVING CALL

次に、顧客ページから離れて、更新せずにもう一度戻るので、コントローラーは初期化コードを再度実行し、ハンドラーを複製します。

CALLED INITIALIZE DEVICE
[Device] Found existing Device; using new token but ignoring options
[PStream] Setting token and publishing listen
CALLED INITIALIZE DEVICE
[Device] Found existing Device; using new token but ignoring options
[PStream] Setting token and publishing listen
[Device] Found existing Device; using new token but ignoring options
[PStream] Setting token and publishing listen
[Twilio.PeerConnection] signalingState is "have-local-offer"
[Twilio.PeerConnection] signalingState is "stable"
[Twilio.PeerConnection] iceConnectionState is "checking"
[Twilio.PeerConnection] iceConnectionState is "connected"
[Twilio.PeerConnection] iceConnectionState is "completed"
[Connection] Received HANGUP from gateway
[Connection] Disconnecting...
[Twilio.PeerConnection] iceConnectionState is "closed"
[Twilio.PeerConnection] signalingState is "closed"
SAVING CALL
SAVING CALL
SAVING CALL

を使用してみTwilio.Device.destroy()ましたが、ハンドラーはまだそこにあります。

ハンドラーが既に Twilio デバイスにアタッチされているかどうかを確認するにはどうすればよいですか? または、Angular アプリの別の場所にイベント ハンドラーをアタッチする必要がありますか?

編集:参考までに、通話を切断する方法は次のとおりです(ボタンに接続されています):

function hangUp() {
    Twilio.Device.disconnectAll();
}
4

2 に答える 2

1

ハンドラーを呼び出すときに登録が解除されていない場合は、デバイスを再度使用するために、呼び出し後に新しいトークンでDevice.setup()Twilio.Device.destroy()呼び出す必要があるため、トークンの有効期限の問題が発生している可能性があります。Device.destroy()

接続を確実に終了させる別の方法は、 を呼び出すことTwilio.Device.disconnectAll();です。おそらく、ハンドラー関数が実際に終了を処理していない可能性があります。

トークンのセットアップをチェックインした後の状況を教えてください。また、問題をより明確に把握するのに役立つ関連するログ情報を提供してください。

于 2016-08-30T21:03:57.430 に答える