Mic*_*hel 4 javascript ios firebase firebase-cloud-messaging
我正在使用一个调用 Firebase 云函数的 iOS 应用程序来存储 FCM 令牌,以供以后发送通知时使用。问题是它不起作用。
我正在使用 Cloud Firestore 数据库。
当函数被调用时,这就是我想要发生的事情。该函数根据数据库检查参数。如果所提供参数中的数据已在数据库中找到,则不会发生任何情况。如果没有找到,则应将其添加到数据库中。
我的云函数代码如下。如果有人能帮助我找到确切的问题,我会很高兴。
exports.addNewElement = functions.https.onCall((data, context) => {
console.log('--addNewElement-- has been called with:\n' + data.fcmToken + '\n!!');
var collectionRef = db.collection("THE_COLLECTION");
// Create a query against the collection.
var query = collectionRef.where("fcmToken", "==", data.fcmToken);
query.get().then(function(doc) {
if (doc.exists) { // We should do nothing.
console.log("Document data:", doc.data());
} else { // We should add the new element.
// doc.data() will be undefined in this case
console.log("No such document!");
collectionRef.add({"fcmToken": fcmToken})
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
});
Run Code Online (Sandbox Code Playgroud)
我可以想象处理 FCM 代币的其他方向。有什么推荐的方法可以用作最佳实践吗?
我采取了一些不同的方法。我有一个 ionic 应用程序,在应用程序向 FCM 注册后(我们有 FCM 令牌),我将令牌直接从应用程序添加到“设备”集合中。这样,用户就可以登录多个设备,并且我们将拥有每个设备的令牌,使我们能够将消息发送到每个设备。如果要向用户发送消息,请查询该 uid 的设备集合以获取该用户的所有令牌
保存令牌:
private saveTokenToFirestore(person: Person, token) {
if (!token) return;
const devicesRef = this.afs.collection('devices')
const docData = {
token,
userId: person.id,
}
return devicesRef.doc(token).set(docData)
}
Run Code Online (Sandbox Code Playgroud)
其中 person.id 是 firebase uid。
然后,我使用 firebase 函数来监视某些节点,以确定何时发送 FCM 消息。
例如,我们有以人员为成员的团队,他们可以互相聊天。当一个人向团队发送消息时,每个团队成员(发送者本人除外)都需要收到通知。
向除发件人本人之外的所有成员发送通知:
exports.chatMessageOnCreateSendFcm = functions.firestore
.document('chatGroups/{teamId}/messages/{messageId}')
.onCreate(async (snap, context) => {
const data = snap.data();
const teamId = context.params.teamId;
const name = data.pName;
const message = data.msg;
const userId = data.pId;
// Notification content
const payload = {
notification: {
title: name,
body: message,
}
}
const db = admin.firestore();
// get the team (chatGroup)
const teamRef = db.collection('teams').doc(teamId);
const teamSnapshot = await teamRef.get();
const team = teamSnapshot.data();
const devicesRef = db.collection('devices');
const queries: Promise<FirebaseFirestore.QuerySnapshot>[] = team.members
.filter(f => f.id !== userId)
.map(member => {
return devicesRef.where('userId', '==', member.id).get();
});
return Promise.all(queries)
.then((querySnapshots) => {
const tokens = [];
querySnapshots.forEach(snapShot => {
if (snapShot) {
snapShot.docs.forEach(doc => {
if (doc) {
const token = doc.data().token;
if (token) {
tokens.push(token);
}
}
})
}
});
if (tokens.length === 0) {
return Promise.resolve(null);
} else {
return admin.messaging().sendToDevice(tokens, payload);
}
})
.catch(err => {
console.error(err);
return Promise.resolve(null);
});
});
Run Code Online (Sandbox Code Playgroud)
您可以修改以上内容以满足您的需要。希望能帮助到你
| 归档时间: |
|
| 查看次数: |
5099 次 |
| 最近记录: |