菜鸟教程小白 发表于 2022-12-13 05:08:46

javascript - 在线存储 FCM 代币


                                            <p><p>我正在使用一个调用 Firebase 云函数的 iOS 应用来存储 FCMtoken ,以供以后在发送通知时使用。问题是它不起作用。</p>

<p>我正在使用 Cloud Firestore 数据库。</p>

<p>当函数被调用时,这就是我想要发生的事情。该函数根据数据库检查参数。如果提供的参数中的数据已经在数据库中找到,那么什么都不会发生。
如果未找到,则应将其添加到数据库中。</p>

<p>我的云功能代码如下。如果有人能帮我找到确切的问题,我会很高兴。</p>

<pre><code>exports.addNewElement = functions.https.onCall((data, context) =&gt; {
console.log(&#39;--addNewElement-- has been called with:\n&#39; + data.fcmToken + &#39;\n!!&#39;);
var collectionRef = db.collection(&#34;THE_COLLECTION&#34;);

// Create a query against the collection.
var query = collectionRef.where(&#34;fcmToken&#34;, &#34;==&#34;, data.fcmToken);
query.get().then(function(doc) {
    if (doc.exists) { // We should do nothing.
      console.log(&#34;Document data:&#34;, doc.data());
    } else { // We should add the new element.
      // doc.data() will be undefined in this case
      console.log(&#34;No such document!&#34;);
      collectionRef.add({&#34;fcmToken&#34;: fcmToken})
    }
}).catch(function(error) {
    console.log(&#34;Error getting document:&#34;, error);
});
});
</code></pre>

<p>我可以想象处理 FCMtoken 的其他方向。
有什么推荐的方法可以用作最佳实践吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我采取了一些不同的方法。我有一个 ionic 应用程序,在应用程序向 FCM 注册后(我们有 FCMtoken ),我直接从应用程序将 token 添加到“设备”集合中。这样,用户可以登录多个设备,我们将拥有每个设备的 token ,使我们能够将消息发送到每个设备。如果要向用户发送消息,请查询该 uid 的设备集合以获取该用户的所有 token </p>

<p><strong>保存 token :</strong></p>

<pre><code>    private saveTokenToFirestore(person: Person, token) {
      if (!token) return;
      const devicesRef = this.afs.collection(&#39;devices&#39;)

      const docData = {
          token,
          userId: person.id,
      }

      return devicesRef.doc(token).set(docData)
      }
</code></pre>

<p>其中 person.id 是 firebase uid。</p>

<p>然后我使用 firebase 函数监控一些节点以确定何时发送 FCM 消息。</p>

<p>例如我们有团队成员,他们可以互相聊天。当一个人向团队发送消息时,每个团队成员(发送者本人除外)都需要收到通知。</p>

<p><strong>向除发件人本人以外的所有成员发送通知:</strong></p>

<pre><code>exports.chatMessageOnCreateSendFcm = functions.firestore
    .document(&#39;chatGroups/{teamId}/messages/{messageId}&#39;)
    .onCreate(async (snap, context) =&gt; {
      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(&#39;teams&#39;).doc(teamId);
      const teamSnapshot = await teamRef.get();
      const team = teamSnapshot.data();
      const devicesRef = db.collection(&#39;devices&#39;);
      const queries: Promise&lt;FirebaseFirestore.QuerySnapshot&gt;[] = team.members
            .filter(f =&gt; f.id !== userId)
            .map(member =&gt; {
                return devicesRef.where(&#39;userId&#39;, &#39;==&#39;, member.id).get();
            });

      return Promise.all(queries)
            .then((querySnapshots) =&gt; {
                const tokens = [];
                querySnapshots.forEach(snapShot =&gt; {
                  if (snapShot) {
                        snapShot.docs.forEach(doc =&gt; {
                            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 =&gt; {
                console.error(err);
                return Promise.resolve(null);
            });
    });
</code></pre>

<p>您可以修改以上内容以满足您的需要。希望对你有帮助</p></p>
                                   
                                                <p style="font-size: 20px;">关于javascript - 在线存储 FCM 代币,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/53588736/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/53588736/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: javascript - 在线存储 FCM 代币