2016-05-12 56 views
0

我在使用Swift中的TwilioClient庫的iOS應用程序中使用Twilio。我建立的應用程序可以從用戶A的設備連接到用戶B的設備或外部電話號碼。這工作正常。我現在需要做的是將第三方加入呼叫,第三個iOS設備(用戶C)或額外的外線。使用Twilio我想使用iOS設備將第三方添加到呼叫

我知道我需要使用會議功能來做到這一點,但我沒有找到如何用iOS的TwilioClient庫來實現這個功能的例子。目前我的TwiML服務器是Python快速啓動服務器(對於雙方通話來說很好)。

什麼我不清楚上是:

  1. 使用TwilioClient device.connect(...)調用如何將&用戶B連接到用戶擺在首位的會議室?

  2. 一旦我在電話會議中有A & B,我如何使用TwilioClient引入C方?我已經連接到device.connect(...),它隱藏了我的所有REST API代碼。

  3. 由於我不知道在通話開始時是否需要第三方,有一種方法可以直接連接,然後將所有參與方添加到電話會議中,一旦我們決定需要添加用戶C?

感謝, KeithB

回答

1

下面是如何在我的OP解決問題1的答案。

當你使用iOS調用device.connect(...)時,它調用TwiML服務器/調用URL(在我的情況下是Python服務器),它返回「TwiML」(Twilio Markup Language)。基本模式是直接呼叫目的地。爲此,TwiML服務器使用傳遞的參數To:和From:並構造返回的TwiML「Dial」字符串。這會導致Twilio使用From:號碼作爲Callerid撥打To:號碼。

爲了讓雙方都參加會議,分兩步進行。首先修改TwiML代碼,告訴Twilio將呼叫者放入會議室。其次,您使用TwiML服務器上的REST API讓Twilio呼叫To:呼叫者並將其放入會議室。

這需要進行一些更改。首先,您必須在iOS應用中通過device.connect(...)調用的會議室名稱。

connection = device?.connect(["To": "+1234567890", "Conference": "MyConference"], delegate: delegate) 

然後,您必須在Python服務器中修改/調用路由以返回會議室的TwiML並進行出站REST調用。

from twilio.rest import TwilioRestClient 

@app.route('/call', methods=['GET', 'POST']) 
    def call(): 
    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID) 
    auth_token = os.environ.get("AUTH_TOKEN", AUTH_TOKEN) 
    from_value = request.values.get('From') 
    to = request.values.get('To') 
    conf_room = request.values.get('Conference') 
    callsid_value = request.values.get('CallSid') 

    # This section creates the TwiML code that will be returned 
    # This causes the caller to be placed in a conference room 
    # Note: endConferenceOnExit=true ends conference when call originator exits 
    conf_response = twilio.twiml.Response() 
    conf_response.dial(callerId=from_value).conference(conf_room, endConferenceOnExit="true") 

    # This section makes the REST call out to the To: number 
    client = TwilioRestClient(account_sid, auth_token) 
    call = client.calls.create(url="www.YourPythonServer" + "/getconf?Conference=" + conf_room, 
          to=to, 
          from_=from_value, 
          method="POST", 
          status_callback="www.YourPythonServer" + "/callback?init_callsid=" + callsid_value, 
          status_callback_method="POST", 
          status_events=["completed"]) 
return str(conf_response) 

當我們調用client.calls.create(...)它使Twilio到隨後致電URL「www.yourpythonserver/getconf ...」得到它使用瞭解如何執行的TwiML去電。

@app.route('/getconf', methods=['GET', 'POST']) 
    def getconf(): 
    resp = twilio.twiml.Response() 
    conf_room = request.values.get('Conference') 

    resp.dial().conference(conf_room) 
    return str(resp) 

你會注意到上面我們也有一個參數「status_callback」。這用於讓我們知道To:調用者的狀態。在這種情況下,我們要求'完整',但我們也可能會得到「無應答」,「忙碌」&「失敗」。如果我們不這樣做,並且通話不成功,則主叫方將只坐在空閒的會議室中,而不知道傳出的呼叫不成功。這需要Python服務器中的另一條路線。

@app.route('/callback', methods=['GET', 'POST']) 
    def callback(): 

    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID) 
    auth_token = os.environ.get("AUTH_TOKEN", AUTH_TOKEN) 
    init_callsid = request.values.get('init_callsid') 
    callback_status = request.values.get('CallStatus') 

    # Check to see what status was passed in. Note that "completed" is 
    # passed after a successful call and the To: party hangs up or drops. 
    # You can implement any behavior you want here, but this code 
    # simply hangs up the originating caller. This might not be appropriate 
    # if there are still other parties in the call. 
    if callback_status == 'completed' or callback_status == "no-answer" or callback_status == 'busy' or callback_status == 'failed': 
    client = TwilioRestClient(account_sid, auth_token) 
    call = client.calls.hangup(init_callsid) 

    return str("") 
+0

嗨基思,感謝這個真棒更新。真棒看到你想出來並回到這裏分享它!我可以給你發襯衫說謝謝嗎?電子郵件[email protected]。乾杯。 –

0

以下是對我的OP中問題#2的回答。

步驟#1後,我們有一個名爲'MyConference'的會議室,與各方1 & 2(從&到)。現在我們想要在會議中添加第三方,並從我們的iPhone中觸發該操作。

我們需要做的是在我們的python服務器中創建一個新的Route,並直接從我們的iOS代碼中調用該路由。

在Python服務器代碼將是這個樣子:

@app.route('/add_to_conference', methods=['GET', 'POST']) 
    def add_to_conference(): 
    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID) 
    auth_token = os.environ.get("AUTH_TOKEN", AUTH_TOKEN) 
    from_value = request.values.get('From') 
    to = request.values.get('To') 
    conf_room = request.values.get('Conference') 

    client = TwilioRestClient(account_sid, auth_token) 
    call = client.calls.create(url="www.YourPythonServer" + "/getconf?Conference=" + conf_room, 
          to=to, 
          from_=from_value, 
          method="POST", 
          status_callback="www.YourPythonServer" + "/callback?Conference=" + conf_room, 
          status_callback_method="POST", 
          if_machine = "Hangup", 
          status_events=["completed"] 
          ) 

return str("True") 

上面的代碼將使一個REST調用,將導致Twilio進行傳出呼叫「到」電話號碼和放置在會議室裏舉行派對。您會注意到,就像第1步中的代碼一樣,我們使用'/ getconf'路由。 Twilio服務器將調用此URL來獲取定義應該如何處理呼叫的TwiML。

@app.route('/getconf', methods=['GET', 'POST']) 
def getconf(): 
resp = twilio.twiml.Response() 
conf_room = request.values.get('Conference') 

resp.dial().conference(conf_room) 
return str(resp) 

我們還定義了呼叫完成(掛斷)或呼叫者#2或#3失敗時調用的'/ callback'路由。自回答第1步以來,我增強了此回調的工作方式。我的目標是,當所有「到」方掛斷電話時,僅將原呼叫方留在會議室中,呼叫應掛斷原呼叫方。否則,來電者將僅僅留在會議室聽音樂。這不是預期的。

因此我採取了以下回調代碼:

@app.route('/callback', methods=['GET', 'POST']) 
    def callback(): 
    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID) 
    auth_token = os.environ.get("AUTH_TOKEN", AUTH_TOKEN) 

    callback_status = request.values.get('CallStatus') 
    conf_room = request.values.get('Conference') 

    client = TwilioRestClient(account_sid, auth_token) 
    conferences = client.conferences.list(friendly_name=conf_room, status = "in-progress") 
    if (len(conferences) > 0): 
    conference = conferences[0] 
    participants = client.participants(conference.sid).list() 
    if len(participants) == 1: 
     participant = participants[0] 
     call = client.calls.hangup(participant.call_sid) 

    return str("200") 

調用時,該代碼抓住按名稱的會議室,然後抓住參與者在會議室的列表。如果只剩下一名參與者,則它掛在最後一名參與者身上。

最後一步是從您的iOS代碼撥打電話。這很簡單,您不需要爲此調用使用Twilio客戶端庫,只需將From,To和會議室名稱作爲參數傳入http GET請求即可。像這樣:

http:/yourpythonserver.com/add_to_conference?To=1234567890&From=0987654321&Conference=MyConference 

這將激活整個過程,派對#3將被放置在會議室!