You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio Serverless生产环境推送通知失败,如何绑定推送凭证?

问题描述

我有一个部署在Twilio Serverless环境中的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

该应用在开发环境中运行正常,推送通知可触发并发送至对应iOS设备。但部署到生产环境并配合TestFlight构建版本使用时,服务器上下文似乎未使用正确的证书凭证,出现以下错误:

  • 52004 - Credential SID not specified
  • 52134 - Invalid APNs device token

我确认推送证书是正确的,因为iOS客户端间的聊天在开发和生产环境中均正常,推送通知也能正常发送和接收。请问在Serverless环境中,需要如何将生产推送凭证绑定到Twilio客户端?


解决方案

1. 关联推送凭证到消息服务

你的代码当前使用普通短信API发送消息,并未关联推送凭证。要触发APNs推送,需将生产环境的APN_PUSH_CREDENTIAL_SID绑定到Twilio Messaging Service,而非直接指定号码:

  • 在Twilio控制台创建/配置生产环境的Messaging Service,将生产推送凭证SID关联到该服务的推送配置中。
  • 在Serverless环境新增MESSAGING_SERVICE_SID环境变量,指向生产的Messaging Service SID。
  • 修改代码使用messagingServiceSid代替from参数:
await twilioClient.messages
.create({ 
  body: text, 
  to: toAddress, 
  messagingServiceSid: context.MESSAGING_SERVICE_SID
})

2. 针对Conversations场景显式指定凭证

如果你的推送是和Twilio Conversations集成,需使用Conversations的消息API,并在创建消息时指定生产推送凭证:

await twilioClient.conversations.v1.conversations(context.CONVERSATIONS_SID)
  .messages.create({
    body: text,
    author: 'server',
    pushCredentialSid: context.APN_PUSH_CREDENTIAL_SID
  });

注意:普通短信API不会触发Conversations的推送逻辑,必须使用Conversations专属API才能关联会话的推送配置。

3. 验证环境变量与设备令牌

  • 在Serverless函数中添加日志,确认生产环境加载的APN_PUSH_CREDENTIAL_SID是生产凭证而非开发沙箱凭证:
console.log("当前推送凭证SID:", context.APN_PUSH_CREDENTIAL_SID);
  • 确保TestFlight版本的iOS设备使用的是生产设备令牌,避免用开发环境生成的令牌在生产环境发送,导致52134错误。

4. 检查客户端与服务端的环境一致性

TestFlight构建属于生产环境,需确保:

  • iOS客户端配置的是生产环境的Twilio应用信息(APP_SID等)
  • Serverless环境的所有相关变量(CONVERSATIONS_SID、APN_PUSH_CREDENTIAL_SID)均对应生产环境资源

内容的提问来源于stack exchange,提问作者Warren Burton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:42