下面是如何在我的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("")
嗨基思,感謝這個真棒更新。真棒看到你想出來並回到這裏分享它!我可以給你發襯衫說謝謝嗎?電子郵件[email protected]。乾杯。 –