У меня есть программируемое приложение для обмена сообщениями Twilio, которое развернуто в бессерверной среде Twilio.
let response = new Twilio.Response();
exports.handler = async function(context, event, callback) {
const accountSid = context.ACCOUNT_SID
const authToken = context.AUTH_TOKEN
const twilioClient = context.getTwilioClient();
const toAddress = event.to;
const fromAddress = event.from
var text = "something something";
await twilioClient.messages
.create({
body: text,
to: toAddress,
from: fromAddress
})
.then(...)
.catch(...)
response.setStatusCode(200);
callback(null, response);
}
Производство и разработка имеют отдельные наборы переменных среды, которые указывают на их собственные сертификаты песочницы/производства.
ACCOUNT_SID=ACxxx
AUTH_TOKEN=xxx
API_KEY_SID=SKxxx
API_SECRET=xxx
APP_SID=APxxx
PUSH_CREDENTIAL_SID=CRxxx
CONVERSATIONS_SID=ISxxx
APN_PUSH_CREDENTIAL_SID=CRxxx
Это отлично работает при разработке, и push-уведомления запускаются и отправляются на соответствующее устройство iOS.
После развертывания в рабочей среде и использования со сборкой TestFlight кажется, что контекст сервера не использует правильные учетные данные сертификата. Я получаю ошибки
Я знаю, что push-сертификаты верны, поскольку межклиентские чаты iOS работают как в dev, так и в prod, а push-уведомления отправляются и приходят, как и ожидалось.
Мой вопрос в том, какой секретный соус мне нужен для привязки/присоединения производственных учетных данных push к клиенту Twilio при использовании из бессерверного контекста.





Ошибка возникла из-за проблемы с конфигурацией в Twilio.
На практике это означает, что для определенных настроек невозможно объединить отладку и производство в одной учетной записи.
Эту проблему можно обойти, переключаясь между экземплярами службы разговоров, например:
const twilioClient = context.getTwilioClient();
const configuration_post = await twilioClient.conversations.v1
.configuration()
.update({ defaultChatServiceSid: myConversationServiceSid });
await twilioClient.messages
.create({
body: text,
to: toAddress,
from: fromAddress
})
Это означает, что вам нужно не забыть переключить его обратно на желаемый сервис после завершения разработки.
Однако если вы используете веб-перехватчики Post Event, такие как onConversationAdded, они запускаются асинхронно, и служба диалога, установленная в конце потока отправки сообщений, может быть не той, которая вам нужна.