我正在关注使用Heroku上的python部署的,并且能够拨打电话。这是我遇到的问题。我没有修改任何TVOIncomingCall
实例或PKPushRegistry
的init或委托逻辑。实际上,当我编译时,日志说"pushRegistry:didUpdatePushCredentials:forType"
和"Successfully registered for VoIP push notifications."
这让我觉得我的server.py中的传入处理程序是问题。使用Twilio可编程语音SDK接收呼叫
我的问题是这样的:在python中,什么是正确的方式来触发VoIP推送通知来通知用户来电?我已经在我的应用程序中启用了VoIP服务,并生成了VoIP服务证书(.p12),并收到了有效的PUSH_CREDENTIAL_SID
我的努力,但如何处理?
快速入门说打我的服务器的'placeCall'端点,所以我更新我的Twilio号码的传入路径,并相应地在仪表板中指出它,但这会导致“应用程序错误已发生”响应,每当有人打电话给我的Twilio号码。
这里是我的server.py相关代码:
import os
from flask import Flask, request
from twilio.jwt.access_token import AccessToken, VoiceGrant
from twilio.rest import Client
import twilio.twiml
ACCOUNT_SID = 'ACxxxxxxxx'
API_KEY = 'SKxxxxxxxxxxxxxxxx'
API_KEY_SECRET = 'xxxxxxxxxxxxxxxx'
PUSH_CREDENTIAL_SID = 'CRxxxxxxxxxxxxxxxx'
APP_SID = 'APxxxxxxxxxxxxxxxx'
ACCOUNT_AUTH = 'xxxxxxxxxxxxxxxx'
IDENTITY = 'MyApp' #not literally
app = Flask(__name__)
@app.route('/accessToken')
def token():
account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID)
api_key = os.environ.get("API_KEY", API_KEY)
api_key_secret = os.environ.get("API_KEY_SECRET", API_KEY_SECRET)
push_credential_sid = os.environ.get("PUSH_CREDENTIAL_SID", PUSH_CREDENTIAL_SID)
app_sid = os.environ.get("APP_SID", APP_SID)
grant = VoiceGrant(
push_credential_sid = push_credential_sid,
outgoing_application_sid = app_sid
)
token = AccessToken(account_sid, api_key, api_key_secret, IDENTITY)
token.add_grant(grant)
return str(token)
@app.route('/placeCall', methods=['GET', 'POST'])
def placeCall():
account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID)
api_key = os.environ.get("API_KEY", API_KEY)
api_key_secret = os.environ.get("API_KEY_SECRET", API_KEY_SECRET)
push_credential_sid = os.environ.get("PUSH_CREDENTIAL_SID", PUSH_CREDENTIAL_SID)
app_sid = os.environ.get("APP_SID", APP_SID)
CALLER_ID = request.values.get('From')
IDENTITY = request.values.get('To')
#client = Client(api_key, api_key_secret, account_sid)
client = Client(api_key, api_key_secret, account_sid, app_sid, push_credential_sid)
call = client.calls.create(to='client:' + IDENTITY, from_= 'client:' + CALLER_ID)
return str(call.sid)
我Identity
值显然是错误的。我认为它需要等同于某个应用程序实例的引用。在快速启动python示例中,IDENTITY = 'voice_test'
另外,PUSH_CREDENTIAL_SID
在哪里起作用?
在此先感谢。
UPDATE
______
按@ philnash的评论,我已经嵌套在dial
动词内部client
名词。这是我的新/incoming
端点:
@app.route('/incoming', methods=['GET', 'POST'])
def incoming():
CALLER_ID = request.values.get('From')
resp = twilio.twiml.Response()
resp.dial(client = IDENTITY, callerId = CALLER_ID, record = "record-from-answer-dual")
return str(resp)
现在,这导致在调试器,说明“未知的或意外的嵌套元素”作为一个可能的原因的“架构验证警告”。我是否错误地注册了客户端?旧的SDK允许你显式传入你的clientName作为参数。
的IDENTITY
串在我的server.py是:
- 定义的任何方法范围之外。
- 用于生成accessToken
- 嵌套在
client
名词的dial
动词。
感谢菲尔的回应!我已经更新了我原来的问题。请参阅更新部分中的注释。 :) –
感谢您的更新。我认为你没有正确地进行嵌套,请检查我的更新答案。行! – philnash
行!现在我们到了某个地方!更新服务器与您的建议,现在变得'错误 - 52134 - 无效APNs设备令牌'。我将重新生成并上传新的VoIP服务证书并更新我的推送凭据SID。感谢菲尔。 –