如何检查客户的联系人是否正在使用我的应用程序?

我目前正在使用 Firebase 开发应用。

我的 Firestore 数据库如下所示:

如何检查客户的联系人是否正在使用我的应用程序?

一旦用户通过 Firebase 身份验证程序,我就会创建一个用户文档,其中包含一个“电话:”字段,其中包含他的电话号码。基本上,所有将要使用该应用程序的人都会被列在数据库中。

这是我的挑战:

我正在使用插件 easy_contact_picker 将用户设备的所有联系人存储到列表中。

如何确定用户联系人是否正在使用该应用,或者他们是否列在数据库中?

我的目标是创建一个联系人列表小部件,显示我的所有联系人。但那些正在使用该应用程序或在数据库中列出的联系人,应突出显示或特别标记。

如果我们考虑到数据库中列出了数百万用户(以最小化计算能力),那么哪种方法是实现这一点的最佳方式?

有人有想法吗?

非常感谢

lijiaweihuilaile 回答:如何检查客户的联系人是否正在使用我的应用程序?

首先尽量避免让每个人都可以读取所有用户。这是大多数人在处理此类问题时所做的事情。这样做是因为如果您不授予阅读所有用户的权限,则对所有用户的查询将不起作用。

出于安全原因,我会将检查用户是否存在的逻辑移到可调用函数中(不是 http 函数!)。这样你就可以在你的应用程序内部调用它并检查一个或多个数组中的用户。这将取决于您的前端将如何处理它。

非常重要的是,以绝对相同的格式存储所有电话号码。这样你就可以查询它们。无论用户数量有多少,您总能找到像这里这样的特定用户:

var citiesRef = db.collection("users");

var query = citiesRef.where("Phone","==","+4912345679");

数字必须完全相同,不能有任何空空格 - 字符,+49 或 0049 也必须相同。

您可以创建两个可调用函数。一个用于检查您的应用程序中是否存在单个用户,另一个用于您发送一组电话号码并返回一个数组。云函数可以使用 Promise.all 并行执行此类查询,因此您可以非常快速地获得响应。

我正在使用类似的方法将我的应用程序中的用户添加为特定组的管理员,您只需在其中输入用户的电子邮件,如果他在应用程序中,他就会被添加。我不是他在电子邮件中收到了加入应用程序的邀请。

,

在 Tarik 的回答的帮助下,Ayrix 和我想出了以下解决方案。

重要提示:阅读 Tarik 的回答以了解更多信息。

客户: callable_compare_contacts.dart

import 'package:cloud_functions/cloud_functions.dart';

Future<List<Object>> getMembersByPhoneNumber(List<String> allPhoneNumbers) async {
  HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('membersByPhoneNumber');
  final results = await callable.call(<String,dynamic>{'allPhoneNumbers': allPhoneNumbers});

  return results.data;
}

服务器: index.js

const functions = require("firebase-functions");
const admin = require("firebase-admin");
if (admin.apps.length === 0) {
  admin.initializeApp({
    credential: admin.credential.applicationDefault(),});
}

exports.membersByPhoneNumber = functions.https.onCall((data,context) => {
  return new Promise((resolve,reject) => {
    if (!data || !data.allPhoneNumbers.length) return resolve([]);
    const phoneNumbers = data.allPhoneNumbers;
    // TODO: different scope? move vars for future use
    const db = admin.firestore();
    const collectionRef = db.collection("User");

    let batches = [];
    // because of wrong eslint parsing (dirty)
    batches = [];
    while (phoneNumbers.length) {
      // firestore limits batches to 10
      const batch = phoneNumbers.splice(0,10);
      // add the batch request to to a queue
      batches.push(
          new Promise((response) => {
            collectionRef.where("Phone","in",[...batch]).get()
                .then((results) =>
                  response(results.docs.map(function(result) {
                    return result.data().Phone;
                  } )));
          })
      );
    }
    // response / return to client
    Promise.all(batches).then(function(content) {
      // console.log("content.flat()");
      // console.log(content.flat());
      return resolve(content.flat());
    });
  });
});

注意:这是我们的第一个可调用/云函数..所以欢迎提出更改建议。

本文链接:https://www.f2er.com/297881.html

大家都在问