Android Java调用Firebase可调用云函数的参数传递问题求助
Android Java调用Firebase可调用云函数的参数传递问题求助
兄弟,我看你碰到的问题挺闹心的——Java端明明传了fcmTokens、title这些参数,到云函数那边却变成了{ '0': '' },连单个token都传不过去。这情况我之前帮人排查过,大概率是云函数的写法错了,或者有一些容易忽略的细节没注意到,给你一步步捋排查思路:
首先,先去确认你的云函数是不是用了可调用函数的正确写法!很多人会搞混Firebase的两种HTTP函数:可调用函数(onCall)和普通HTTP函数(onRequest),这俩的参数获取逻辑完全不一样,用错了肯定拿不到正确参数。
正确的可调用函数写法(以Node.js为例)应该是这样的:
exports.sendCustomNotification = functions.https.onCall((data, context) => { // 直接通过data.xxx获取Java端传的参数 const fcmTokens = data.fcmTokens; const title = data.title; const body = data.body; // 先打个日志确认收到的参数,方便排查 console.log("实际收到的参数:", data); // 后续的推送逻辑... });
而下面这种是错误的写法,这是给普通HTTP请求用的,不是Firebase客户端可调用函数的写法:
// 别用这个!这是普通HTTP触发函数的写法 exports.sendCustomNotification = functions.https.onRequest((req, res) => { const data = req.body; // 这里拿不到可调用函数传的参数 // ... });
如果云函数写法没问题,那再检查这几个细节:
- 看看Java端的Firebase Functions SDK是不是版本太旧了,旧版本可能存在参数序列化的bug。去Module级的
build.gradle里把依赖更到最新版,比如:implementation 'com.google.firebase:firebase-functions:20.3.0' // 换成当前最新的版本号 - 确认云函数部署的区域和Java端初始化的区域一致。比如如果你的函数部署在
asia-east2,Java端初始化时要指定区域:
区域不匹配的话,可能会调用到不存在的函数,或者参数传递时出现异常。FirebaseFunctions mFunctions = FirebaseFunctions.getInstance("asia-east2"); - 你可以在Java端把组装好的
data打印出来,确认键值对都正确:
要是输出是Log.d("FirebaseParams", "组装的参数:" + data.toString());{fcmTokens=[test], title=test, body=test},那Java端肯定没问题,问题100%出在云函数那边。
最后,要是还没解决,去Firebase控制台的云函数日志里看看console.log打出来的内容,直接看函数实际收到的参数是什么,这样就能精准定位问题了。
备注:内容来源于stack exchange,提问作者Abdulrehman Zia
相关产品推荐
相关产品推荐

