在Firebase Functions中用Node接收SKAdNetwork回传无法读取请求体
核心错误:端点路径不匹配
Apple的SKAdNetwork要求回传请求必须发送到**路径为/.well-known/skadnetwork/report-attribution/**的端点,但你在info.plist中配置的地址是https://us-central1-XXX.cloudfunctions.net/skan/,缺少了Apple强制要求的路径后缀,导致Apple不会向这个地址发送回传请求。
同时你的Express路由定义了/.well-known/skadnetwork/report-attribution/,结合Firebase Functions的路径前缀skan,实际可访问的完整有效路径是https://us-central1-XXX.cloudfunctions.net/skan/.well-known/skadnetwork/report-attribution/,这才是符合Apple要求的端点地址。
解决步骤
1. 修正info.plist中的端点地址
将NSAdvertisingAttributionReportEndpoint的值修改为符合Apple要求的完整路径:
<key>NSAdvertisingAttributionReportEndpoint</key> <string>https://us-central1-XXX.cloudfunctions.net/skan/.well-known/skadnetwork/report-attribution/</string>
2. 确保Express解析请求体
Express默认不会自动解析POST请求的请求体,你需要添加中间件来处理SKAdNetwork的回传数据。SKAdNetwork回传为JSON格式,可添加express.json()中间件:
const app = require("express")(); // 添加JSON请求体解析中间件 app.use(express.json()); app.post("/.well-known/skadnetwork/report-attribution/", function(req, res) { // 现在可正常读取req.body console.log("SKAdNetwork回传数据:", req.body); return res.sendStatus(200); }); exports.skan = functions.https.onRequest(app);
如果遇到JSON解析失败(比如回传为原始二进制格式),可改用express.raw()中间件后手动解析:
app.use(express.raw({ type: '*/*' })); app.post("/.well-known/skadnetwork/report-attribution/", function(req, res) { try { const data = JSON.parse(req.body.toString()); console.log("SKAdNetwork回传数据:", data); } catch (err) { console.error("解析回传数据失败:", err); } return res.sendStatus(200); });
3. 验证端点可达性
用curl模拟SKAdNetwork的POST请求,测试端点是否能正常接收数据:
curl -X POST -H "Content-Type: application/json" -d '{"test": "skan-sample-data"}' https://us-central1-XXX.cloudfunctions.net/skan/.well-known/skadnetwork/report-attribution/
之后查看Firebase Functions日志,确认是否能打印出请求体内容。
额外注意事项
- 确保Firebase Functions已部署成功,且端点可公开访问(无需身份验证)。
- SKAdNetwork自然回传存在延迟,测试时可使用Apple官方的SKAdNetwork测试工具触发测试回传,缩短等待时间。
内容的提问来源于stack exchange,提问作者desmeit

