با استفاده از Cloud Messaging و Cloud Functions اعلان‌ها را برای یک برنامه وب ارسال کنید

1. بررسی اجمالی

در این کد لبه، نحوه استفاده از Cloud Functions برای Firebase را برای افزودن قابلیت به برنامه وب چت با ارسال اعلان به کاربران برنامه چت، یاد خواهید گرفت.

3b1284f5144b54f6.png

چیزی که یاد خواهید گرفت

  • توابع Google Cloud را با استفاده از Firebase SDK ایجاد کنید.
  • عملکردهای Cloud را بر اساس رویدادهای Auth، Cloud Storage و Cloud Firestore فعال کنید.
  • پشتیبانی Firebase Cloud Messaging را به برنامه وب خود اضافه کنید.

آنچه شما نیاز دارید

  • یک کارت اعتباری. Cloud Functions برای Firebase به طرح Firebase Blaze نیاز دارد، به این معنی که باید صورت‌حساب پروژه Firebase خود را با استفاده از کارت اعتباری فعال کنید.
  • ویرایشگر IDE/متن انتخابی شما مانند WebStorm ، Atom یا Sublime .
  • ترمینالی برای اجرای دستورات پوسته با نصب NodeJS v9.
  • مرورگری مانند کروم.
  • کد نمونه برای این کار مرحله بعدی را ببینید.

2. کد نمونه را دریافت کنید

مخزن GitHub را از خط فرمان کلون کنید:

git clone https://github.com/firebase/friendlychat

برنامه شروع را وارد کنید

با استفاده از IDE خود، آن را باز یا وارد کنید android_studio_folder.png دایرکتوری cloud-functions-start از پوشه کد نمونه. این دایرکتوری حاوی کد شروع برای نرم افزار کد است که از یک برنامه وب چت کاملاً کاربردی تشکیل شده است.

3. یک پروژه Firebase ایجاد کنید و برنامه خود را راه اندازی کنید

پروژه ایجاد کنید

در Firebase Console بر روی Add Project کلیک کنید و آن را FriendlyChat بنامید.

روی ایجاد پروژه کلیک کنید.

به طرح Blaze ارتقا دهید

برای استفاده از توابع Cloud برای Firebase، باید پروژه Firebase خود را به طرح صورت‌حساب Blaze ارتقا دهید. برای این کار باید یک کارت اعتباری یا ابزار صورت‌حساب دیگری را به حساب Google Cloud خود اضافه کنید.

همه پروژه‌های Firebase، از جمله پروژه‌های موجود در طرح Blaze، همچنان به سهمیه‌های استفاده رایگان برای توابع ابری دسترسی دارند. مراحل ذکر شده در این کد لبه در محدوده استفاده از لایه رایگان قرار می گیرند. با این حال، هزینه های کوچک ( حدود 0.03 دلار ) را از Cloud Storage که برای میزبانی تصاویر ساخت Cloud Functions شما استفاده می شود، مشاهده خواهید کرد.

اگر به کارت اعتباری دسترسی ندارید یا از ادامه برنامه Blaze ناراحت هستید، از Firebase Emulator Suite استفاده کنید که به شما امکان می دهد توابع Cloud را به صورت رایگان در دستگاه محلی خود شبیه سازی کنید.

Google Auth را فعال کنید

برای اینکه به کاربران اجازه ورود به برنامه را بدهیم، از Google auth استفاده می‌کنیم که باید فعال شود.

در Firebase Console، بخش Build > Authentication > Sign-in tab را باز کنید (یا برای رفتن به آنجا اینجا را کلیک کنید ). سپس، Google Sign-in Provider را فعال کنید و روی Save کلیک کنید. این به کاربران اجازه می دهد تا با حساب های Google خود در برنامه وب وارد شوند.

همچنین، در صورت تمایل نام عمومی برنامه خود را روی چت دوستانه تنظیم کنید:

8290061806aacb46.png

Cloud Storage را فعال کنید

این برنامه از فضای ذخیره سازی ابری برای آپلود تصاویر استفاده می کند. برای فعال کردن Cloud Storage در پروژه Firebase خود، از بخش Storage دیدن کنید و روی دکمه شروع کار کلیک کنید. مراحل را در آنجا طی کنید، و برای مکان ذخیره‌سازی ابری، یک مقدار پیش‌فرض برای استفاده وجود خواهد داشت. سپس روی Done کلیک کنید.

یک برنامه وب اضافه کنید

در کنسول Firebase، یک برنامه وب اضافه کنید. برای انجام این کار، به تنظیمات پروژه بروید و به پایین بروید تا به افزودن برنامه بروید. وب را به عنوان پلتفرم انتخاب کنید و کادر تنظیم Firebase Hosting را علامت بزنید، سپس برنامه را ثبت کنید و برای بقیه مراحل روی Next کلیک کنید، در آخر روی Continue to console کلیک کنید.

4. رابط خط فرمان Firebase را نصب کنید

رابط خط فرمان Firebase (CLI) به شما این امکان را می دهد که به برنامه وب به صورت محلی سرویس دهید و برنامه وب و عملکردهای ابری خود را مستقر کنید.

برای نصب یا ارتقاء CLI دستور npm زیر را اجرا کنید:

npm -g install firebase-tools

برای تأیید اینکه CLI به درستی نصب شده است، یک کنسول را باز کنید و اجرا کنید:

firebase --version

مطمئن شوید که نسخه Firebase CLI بالاتر از 4.0.0 باشد تا تمام آخرین ویژگی های مورد نیاز برای Cloud Function ها را داشته باشد. اگر نه، npm install -g firebase-tools اجرا کنید تا همانطور که در بالا نشان داده شده است ارتقا دهید.

مجوز Firebase CLI را با اجرای:

firebase login

مطمئن شوید که در دایرکتوری cloud-functions-start هستید، سپس Firebase CLI را برای استفاده از Firebase Project خود تنظیم کنید:

firebase use --add

سپس ID پروژه خود را انتخاب کنید و دستورالعمل ها را دنبال کنید. وقتی از شما خواسته شد، می‌توانید هر نام مستعاری مانند codelab را انتخاب کنید.

5. برنامه وب را مستقر و اجرا کنید

اکنون که پروژه خود را وارد و پیکربندی کرده اید، برای اولین بار آماده اجرای برنامه وب هستید! یک پنجره ترمینال را باز کنید، به پوشه cloud-functions-start بروید و برنامه وب را در میزبانی Firebase با استفاده از:

firebase deploy --except functions

این خروجی کنسولی است که باید ببینید:

i deploying database, storage, hosting
✔  database: rules ready to deploy.
i  storage: checking rules for compilation errors...
✔  storage: rules file compiled successfully
i  hosting: preparing ./ directory for upload...
✔  hosting: ./ folder uploaded successfully
✔ storage: rules file compiled successfully
✔ hosting: 8 files uploaded successfully
i starting release process (may take several minutes)...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
Hosting URL: https://friendlychat-1234.firebaseapp.com

برنامه وب را باز کنید

خط آخر باید URL میزبانی را نمایش دهد. اکنون برنامه وب باید از این URL، که باید به شکل https://<project-id>.firebaseapp.com باشد، ارائه شود. بازش کن باید رابط کاربری کاربردی یک برنامه چت را ببینید.

با استفاده از دکمه SIGN-IN WITH GOOGLE به برنامه وارد شوید و با خیال راحت چند پیام اضافه کنید و تصاویر را پست کنید:

3b1284f5144b54f6.png

اگر برای اولین بار در یک مرورگر جدید وارد برنامه می‌شوید، مطمئن شوید که در صورت درخواست، اعلان‌ها را مجاز می‌کنید: 8b9d0c66dc36153d.png

در مرحله بعد باید اعلان‌ها را فعال کنیم.

اگر تصادفاً روی Block کلیک کرده‌اید، می‌توانید این تنظیم را با کلیک کردن روی دکمه 🔒 ایمن در سمت چپ URL در Chrome Omnibar و تغییر دادن نوار کنار اعلان‌ها تغییر دهید:

e926868b0546ed71.png

اکنون، ما با استفاده از Firebase SDK برای توابع ابری، برخی از عملکردها را اضافه خواهیم کرد.

6. فهرست توابع

Cloud Functions به شما این امکان را می دهد که به راحتی کدی داشته باشید که بدون نیاز به راه اندازی سرور در Cloud اجرا شود. نحوه ساخت توابعی که به رویدادهای پایگاه داده Firebase Auth، Cloud Storage و Firebase Firestore واکنش نشان می‌دهند را بررسی خواهیم کرد. بیایید با Auth شروع کنیم.

هنگام استفاده از Firebase SDK برای توابع Cloud، کد توابع شما در فهرست functions (به طور پیش فرض) قرار می گیرد. کد توابع شما نیز یک برنامه Node.js است و بنابراین به یک package.json نیاز دارد که اطلاعاتی درباره برنامه شما ارائه دهد و وابستگی ها را فهرست کند.

برای اینکه کار را برای شما آسان‌تر کنیم، قبلاً فایل functions/index.js را ایجاد کرده‌ایم که کد شما در آن قرار می‌گیرد. قبل از حرکت به جلو، این فایل را بررسی کنید.

cd functions
ls

اگر با Node.js آشنا نیستید، قبل از ادامه برنامه کدنویسی، اطلاعات بیشتری در مورد آن کسب کنید.

فایل package.json قبلاً دو وابستگی لازم را فهرست می‌کند: Firebase SDK برای توابع Cloud و Firebase Admin SDK . برای نصب آنها به صورت محلی، به پوشه functions بروید و اجرا کنید:

npm install

حالا بیایید نگاهی به فایل index.js بیندازیم:

index.js

/**
 * Copyright 2017 Google Inc. All Rights Reserved.
 * ...
 */

// TODO(DEVELOPER): Import the Cloud Functions for Firebase and the Firebase Admin modules here.

// TODO(DEVELOPER): Write the addWelcomeMessage Function here.

// TODO(DEVELOPER): Write the blurImages Function here.

// TODO(DEVELOPER): Write the sendNotification Function here.

ما ماژول های مورد نیاز را وارد می کنیم و سپس سه تابع را به جای TODO ها می نویسیم. بیایید با وارد کردن ماژول های Node مورد نیاز شروع کنیم.

7. ماژول‌های Cloud Functions و Firebase Admin را وارد کنید

در طول این کد لبه دو ماژول مورد نیاز است: firebase-functions نوشتن محرک‌ها و گزارش‌های توابع Cloud را قادر می‌سازد در حالی که firebase-admin استفاده از پلتفرم Firebase را در سروری با دسترسی سرپرست برای انجام اقداماتی مانند نوشتن به Cloud Firestore یا ارسال اعلان‌های FCM را قادر می‌سازد.

در فایل index.js ، اولین TODO با موارد زیر جایگزین کنید:

index.js

/**
 * Copyright 2017 Google Inc. All Rights Reserved.
 * ...
 */

// Import the Firebase SDK for Google Cloud Functions.
const functions = require('firebase-functions');
// Import and initialize the Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp();

// TODO(DEVELOPER): Write the addWelcomeMessage Function here.

// TODO(DEVELOPER): Write the blurImages Function here.

// TODO(DEVELOPER): Write the sendNotification Function here.

Firebase Admin SDK می‌تواند به‌طور خودکار هنگام استقرار در یک محیط Cloud Functions یا سایر کانتینرهای Google Cloud Platform پیکربندی شود، و این زمانی اتفاق می‌افتد که admin.initializeApp() بدون آرگومان فراخوانی کنیم.

اکنون، بیایید یک تابع اضافه کنیم که وقتی کاربر برای اولین بار در برنامه چت وارد می شود، اجرا می شود و یک پیام چت برای خوش آمدگویی به کاربر اضافه می کنیم.

8. به کاربران جدید خوش آمدید

ساختار پیام های چت

پیام‌های ارسال شده به فید چت FriendlyChat در Cloud Firestore ذخیره می‌شوند. بیایید به ساختار داده ای که برای پیام استفاده می کنیم نگاهی بیندازیم. برای انجام این کار، یک پیام جدید به چت با عنوان "Hello World" ارسال کنید:

11f5a676fbb1a69a.png

این باید به صورت زیر ظاهر شود:

fe6d1c020d0744cf.png

در Firebase Console بر روی Firestore Database در قسمت Build کلیک کنید. باید مجموعه پیام ها و یک سند حاوی پیامی که نوشته اید را ببینید:

442c9c10b5e2b245.png

همانطور که می بینید، پیام های چت در Cloud Firestore به عنوان یک سند با ویژگی های name ، profilePicUrl ، text و timestamp که به مجموعه messages اضافه شده اند، ذخیره می شوند.

افزودن پیام های خوش آمد گویی

اولین تابع Cloud پیامی را اضافه می کند که از کاربران جدید به چت استقبال می کند. برای این کار، می‌توانیم از trigger functions.auth().onCreate استفاده کنیم که هر بار که کاربر برای اولین بار در برنامه Firebase وارد سیستم می‌شود، این تابع را اجرا می‌کند. تابع addWelcomeMessages به فایل index.js خود اضافه کنید:

index.js

// Adds a message that welcomes new users into the chat.
exports.addWelcomeMessages = functions.auth.user().onCreate(async (user) => {
  functions.logger.log('A new user signed in for the first time.');
  const fullName = user.displayName || 'Anonymous';

  // Saves the new welcome message into the database
  // which then displays it in the FriendlyChat clients.
  await admin.firestore().collection('messages').add({
    name: 'Firebase Bot',
    profilePicUrl: '/images/firebase-logo.png', // Firebase logo
    text: `${fullName} signed in for the first time! Welcome!`,
    timestamp: admin.firestore.FieldValue.serverTimestamp(),
  });
  functions.logger.log('Welcome message written to database.');
});

افزودن این تابع به شی exports ویژه، روش Node برای دسترسی به تابع خارج از فایل فعلی است و برای توابع ابری مورد نیاز است.

در عملکرد بالا، ما یک پیام خوشامدگویی جدید ارسال شده توسط "Firebase Bot" را به لیست پیام های چت اضافه می کنیم. ما این کار را با استفاده از روش add در مجموعه messages در Cloud Firestore انجام می‌دهیم، جایی که پیام‌های چت در آن ذخیره می‌شوند.

از آنجایی که این یک عملیات ناهمزمان است، باید Promise را برگردانیم که نشان می‌دهد Cloud Firestore نوشتن کامل شده است تا عملکردهای Cloud خیلی زود اجرا نشوند.

استقرار توابع ابری

توابع ابری تنها پس از استقرار آنها فعال خواهند شد. برای انجام این کار، این را در خط فرمان اجرا کنید:

firebase deploy --only functions

این خروجی کنسولی است که باید ببینید:

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
⚠  functions: missing necessary APIs. Enabling now...
i  env: ensuring necessary APIs are enabled...
⚠  env: missing necessary APIs. Enabling now...
i  functions: waiting for APIs to activate...
i  env: waiting for APIs to activate...
✔  env: all necessary APIs are enabled
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (X.XX KB) for uploading
✔  functions: functions folder uploaded successfully
i  starting release process (may take several minutes)...
i  functions: creating function addWelcomeMessages...
✔  functions[addWelcomeMessages]: Successful create operation. 
✔  functions: all functions deployed successfully!

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlypchat-1234/overview

تابع را تست کنید

هنگامی که عملکرد با موفقیت اجرا شد، باید کاربری داشته باشید که برای اولین بار وارد سیستم شود.

  1. برنامه خود را با استفاده از URL میزبانی (به شکل https://<project-id>.firebaseapp.com ) در مرورگر خود باز کنید.
  2. با یک کاربر جدید، برای اولین بار در برنامه خود با استفاده از دکمه ورود به سیستم وارد شوید.
  • اگر قبلاً وارد برنامه شده اید، می توانید احراز هویت کنسول Firebase را باز کنید و حساب خود را از لیست کاربران حذف کنید. سپس، دوباره وارد شوید.

262535d1b1223c65.png

  1. پس از ورود به سیستم، یک پیام خوش آمدگویی باید به طور خودکار نمایش داده شود:

1c70e0d64b23525b.png

9. تعدیل تصاویر

کاربران می توانند همه نوع تصاویر را در چت آپلود کنند و همیشه مهم است که تصاویر توهین آمیز را تعدیل کنند، به خصوص در پلتفرم های اجتماعی عمومی. در FriendlyChat، تصاویری که در چت منتشر می‌شوند در Google Cloud Storage ذخیره می‌شوند.

با توابع Cloud، می‌توانید آپلود تصاویر جدید را با استفاده از تریگر functions.storage().onFinalize شناسایی کنید. هر بار که یک فایل جدید در Cloud Storage آپلود یا اصلاح می شود، این کار اجرا می شود.

برای تعدیل تصاویر، مراحل زیر را طی می کنیم:

  1. با استفاده از Cloud Vision API بررسی کنید که آیا تصویر به‌عنوان بزرگسال یا خشونت‌آمیز پرچم‌گذاری شده است.
  2. اگر تصویر علامت گذاری شده است، آن را در نمونه در حال اجرا دانلود کنید.
  3. تصویر را با استفاده از ImageMagick محو کنید.
  4. تصویر تار شده را در فضای ذخیره‌سازی ابری آپلود کنید.

Cloud Vision API را فعال کنید

از آنجایی که ما از Google Cloud Vision API در این عملکرد استفاده خواهیم کرد، باید API را در پروژه firebase خود فعال کنید. این پیوند را دنبال کنید، سپس پروژه Firebase خود را انتخاب کرده و API را فعال کنید:

5c77fee51ec5de49.png

وابستگی ها را نصب کنید

برای تعدیل تصاویر، از Google Cloud Vision Client Library برای Node.js، @google-cloud/vision استفاده می‌کنیم تا تصاویر را از طریق Cloud Vision API برای شناسایی تصاویر نامناسب اجرا کنیم.

برای نصب این بسته در برنامه Cloud Functions، دستور زیر npm install --save اجرا کنید. مطمئن شوید که این کار را از پوشه functions انجام می دهید.

npm install --save @google-cloud/vision@2.4.0

این بسته را به صورت محلی نصب می کند و آنها را به عنوان یک وابستگی اعلام شده در فایل package.json شما اضافه می کند.

وابستگی ها را وارد و پیکربندی کنید

برای وارد کردن وابستگی‌هایی که نصب شده‌اند و برخی از ماژول‌های اصلی Node.js ( path ، os و fs ) که در این بخش به آن‌ها نیاز داریم، خطوط زیر را به بالای فایل index.js خود اضافه کنید:

index.js

const Vision = require('@google-cloud/vision');
const vision = new Vision.ImageAnnotatorClient();
const {promisify} = require('util');
const exec = promisify(require('child_process').exec);

const path = require('path');
const os = require('os');
const fs = require('fs');

از آنجایی که عملکرد شما در محیط Google Cloud اجرا می شود، نیازی به پیکربندی کتابخانه های Cloud Storage و Cloud Vision نیست: آنها به طور خودکار برای استفاده از پروژه شما پیکربندی می شوند.

تشخیص تصاویر نامناسب

شما از راه‌انداز functions.storage.onChange Cloud Functions استفاده می‌کنید که به محض ایجاد یا تغییر فایل یا پوشه در یک سطل Cloud Storage، کد شما را اجرا می‌کند. تابع blurOffensiveImages را به فایل index.js خود اضافه کنید:

index.js

// Checks if uploaded images are flagged as Adult or Violence and if so blurs them.
exports.blurOffensiveImages = functions.runWith({memory: '2GB'}).storage.object().onFinalize(
    async (object) => {
      const imageUri = `gs://${object.bucket}/${object.name}`;
      // Check the image content using the Cloud Vision API.
      const batchAnnotateImagesResponse = await vision.safeSearchDetection(imageUri);
      const safeSearchResult = batchAnnotateImagesResponse[0].safeSearchAnnotation;
      const Likelihood = Vision.protos.google.cloud.vision.v1.Likelihood;
      if (Likelihood[safeSearchResult.adult] >= Likelihood.LIKELY ||
          Likelihood[safeSearchResult.violence] >= Likelihood.LIKELY) {
        functions.logger.log('The image', object.name, 'has been detected as inappropriate.');
        return blurImage(object.name);
      }
      functions.logger.log('The image', object.name, 'has been detected as OK.');
    });

توجه داشته باشید که ما برخی از پیکربندی‌های نمونه توابع ابری را اضافه کرده‌ایم که عملکرد را اجرا می‌کند. با .runWith({memory: '2GB'}) ، ما درخواست می کنیم که نمونه به جای حافظه پیش فرض، 2 گیگابایت حافظه دریافت کند، زیرا این تابع حافظه فشرده است.

هنگامی که عملکرد فعال می شود، تصویر از طریق Cloud Vision API اجرا می شود تا تشخیص داده شود که به عنوان بزرگسال یا خشونت آمیز علامت گذاری شده است. اگر تصویر بر اساس این معیارها نامناسب تشخیص داده شود، تصویر را محو می کنیم، که در تابع blurImage انجام می شود که در ادامه خواهیم دید.

تار شدن تصویر

تابع blurImage زیر را در فایل index.js خود اضافه کنید:

index.js

// Blurs the given image located in the given bucket using ImageMagick.
async function blurImage(filePath) {
  const tempLocalFile = path.join(os.tmpdir(), path.basename(filePath));
  const messageId = filePath.split(path.sep)[1];
  const bucket = admin.storage().bucket();

  // Download file from bucket.
  await bucket.file(filePath).download({destination: tempLocalFile});
  functions.logger.log('Image has been downloaded to', tempLocalFile);
  // Blur the image using ImageMagick.
  await exec(`convert "${tempLocalFile}" -channel RGBA -blur 0x24 "${tempLocalFile}"`);
  functions.logger.log('Image has been blurred');
  // Uploading the Blurred image back into the bucket.
  await bucket.upload(tempLocalFile, {destination: filePath});
  functions.logger.log('Blurred image has been uploaded to', filePath);
  // Deleting the local file to free up disk space.
  fs.unlinkSync(tempLocalFile);
  functions.logger.log('Deleted local file.');
  // Indicate that the message has been moderated.
  await admin.firestore().collection('messages').doc(messageId).update({moderated: true});
  functions.logger.log('Marked the image as moderated in the database.');
}

در تابع بالا، تصویر باینری از فضای ذخیره‌سازی ابری دانلود می‌شود. سپس تصویر با استفاده از ابزار convert ImageMagick تار می شود و نسخه تار شده مجدداً در Storage Bucket آپلود می شود. در مرحله بعد، فایل موجود در نمونه توابع ابری را حذف می کنیم تا مقداری فضای دیسک آزاد شود، و این کار را انجام می دهیم زیرا همان نمونه توابع ابری می تواند دوباره استفاده شود و اگر فایل ها پاک نشوند، ممکن است فضای دیسک تمام شود. در نهایت، یک Boolean به پیام چت اضافه می‌کنیم که نشان می‌دهد تصویر تعدیل شده است، و این باعث می‌شود پیام به‌روزرسانی در مشتری ایجاد شود.

استقرار تابع

تابع فقط پس از استقرار آن فعال خواهد شد. در خط فرمان، firebase deploy --only functions اجرا کنید:

firebase deploy --only functions

این خروجی کنسولی است که باید ببینید:

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (X.XX KB) for uploading
✔  functions: functions folder uploaded successfully
i  starting release process (may take several minutes)...
i  functions: updating function addWelcomeMessages...
i  functions: creating function blurOffensiveImages...
✔  functions[addWelcomeMessages]: Successful update operation.
✔  functions[blurOffensiveImages]: Successful create operation.
✔  functions: all functions deployed successfully!

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview

تابع را تست کنید

هنگامی که تابع با موفقیت مستقر شد:

  1. برنامه خود را با استفاده از URL میزبانی (به شکل https://<project-id>.firebaseapp.com ) در مرورگر خود باز کنید.
  2. پس از ورود به برنامه، یک تصویر آپلود کنید: 4db9fdab56703e4a.png
  3. بهترین تصویر توهین‌آمیز خود را برای آپلود انتخاب کنید (یا می‌توانید از این گوشت‌خوار زامبی استفاده کنید!) و پس از چند لحظه، باید پست خود را با یک نسخه تار از تصویر به‌روزرسانی کنید: 83dd904fbaf97d2b.png

10. اعلان های پیام جدید

در این بخش، یک Cloud Function اضافه می‌کنید که هنگام ارسال پیام جدید، اعلان‌هایی را برای شرکت‌کنندگان در چت ارسال می‌کند.

با استفاده از Firebase Cloud Messaging (FCM)، می‌توانید به طور قابل اعتماد اعلان‌هایی را برای کاربران در سراسر سیستم عامل ارسال کنید. برای ارسال اعلان به کاربر، به نشانه دستگاه FCM او نیاز دارید. برنامه وب چت که ما از آن استفاده می کنیم، از قبل هنگام باز کردن برنامه برای اولین بار در مرورگر یا دستگاه جدید، نشانه های دستگاه را از کاربران جمع آوری می کند. این توکن ها در Cloud Firestore در مجموعه fcmTokens ذخیره می شوند.

اگر دوست دارید نحوه دریافت توکن های دستگاه FCM را در یک برنامه وب بیاموزید، می توانید از Firebase Web Codelab بروید.

ارسال اعلان ها

برای تشخیص زمانی که پیام‌های جدید پست می‌شوند، از تریگر functions.firestore.document().onCreate Cloud Functions استفاده می‌کنید که وقتی یک شی جدید در یک مسیر مشخص از Cloud Firestore ایجاد می‌شود، کد شما را اجرا می‌کند. تابع sendNotifications به فایل index.js خود اضافه کنید:

index.js

// Sends a notifications to all users when a new message is posted.
exports.sendNotifications = functions.firestore.document('messages/{messageId}').onCreate(
  async (snapshot) => {
    // Notification details.
    const text = snapshot.data().text;
    const payload = {
      notification: {
        title: `${snapshot.data().name} posted ${text ? 'a message' : 'an image'}`,
        body: text ? (text.length <= 100 ? text : text.substring(0, 97) + '...') : '',
        icon: snapshot.data().profilePicUrl || '/images/profile_placeholder.png',
        click_action: `https://${process.env.GCLOUD_PROJECT}.firebaseapp.com`,
      }
    };

    // Get the list of device tokens.
    const allTokens = await admin.firestore().collection('fcmTokens').get();
    const tokens = [];
    allTokens.forEach((tokenDoc) => {
      tokens.push(tokenDoc.id);
    });

    if (tokens.length > 0) {
      // Send notifications to all tokens.
      const response = await admin.messaging().sendToDevice(tokens, payload);
      await cleanupTokens(response, tokens);
      functions.logger.log('Notifications have been sent and tokens cleaned up.');
    }
  });

در تابع بالا، ما در حال جمع‌آوری توکن‌های دستگاه کاربران از پایگاه داده Cloud Firestore و ارسال اعلان به هر یک از آنها با استفاده از تابع admin.messaging().sendToDevice هستیم.

توکن ها را پاک کنید

در نهایت، می‌خواهیم توکن‌هایی را که دیگر معتبر نیستند حذف کنیم. این زمانی اتفاق می‌افتد که رمزی که زمانی از کاربر دریافت کرده‌ایم دیگر توسط مرورگر یا دستگاه استفاده نمی‌شود. به عنوان مثال، اگر کاربر مجوز اعلان جلسه مرورگر را لغو کرده باشد، این اتفاق می افتد. برای انجام این کار، تابع cleanupTokens زیر را در فایل index.js خود اضافه کنید:

index.js

// Cleans up the tokens that are no longer valid.
function cleanupTokens(response, tokens) {
 // For each notification we check if there was an error.
 const tokensDelete = [];
 response.results.forEach((result, index) => {
   const error = result.error;
   if (error) {
     functions.logger.error('Failure sending notification to', tokens[index], error);
     // Cleanup the tokens that are not registered anymore.
     if (error.code === 'messaging/invalid-registration-token' ||
         error.code === 'messaging/registration-token-not-registered') {
       const deleteTask = admin.firestore().collection('fcmTokens').doc(tokens[index]).delete();
       tokensDelete.push(deleteTask);
     }
   }
 });
 return Promise.all(tokensDelete);
}

استقرار تابع

این تابع فقط پس از استقرار آن فعال خواهد شد و برای استقرار آن، این را در خط فرمان اجرا کنید:

firebase deploy --only functions

این خروجی کنسولی است که باید ببینید:

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (X.XX KB) for uploading
✔  functions: functions folder uploaded successfully
i  starting release process (may take several minutes)...
i  functions: updating function addWelcomeMessages...
i  functions: updating function blurOffensiveImages...
i  functions: creating function sendNotifications...
✔  functions[addWelcomeMessages]: Successful update operation.
✔  functions[blurOffensiveImages]: Successful updating operation.
✔  functions[sendNotifications]: Successful create operation.
✔  functions: all functions deployed successfully!

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview

تابع را تست کنید

  1. هنگامی که عملکرد با موفقیت اجرا شد، برنامه خود را با استفاده از URL میزبانی (به شکل https://<project-id>.firebaseapp.com ) در مرورگر خود باز کنید.
  2. اگر برای اولین بار به برنامه وارد می‌شوید، مطمئن شوید که در صورت درخواست، اعلان‌ها را مجاز می‌کنید: 8b9d0c66dc36153d.png
  3. برگه برنامه چت را ببندید یا برگه دیگری را نمایش دهید: اعلان‌ها فقط در صورتی ظاهر می‌شوند که برنامه در پس‌زمینه باشد. اگر می‌خواهید نحوه دریافت پیام‌ها را در حالی که برنامه‌تان در پیش‌زمینه است یاد بگیرید، به مستندات ما نگاهی بیندازید.
  4. با استفاده از یک مرورگر دیگر (یا یک پنجره ناشناس)، وارد برنامه شوید و یک پیام ارسال کنید. شما باید یک اعلان را مشاهده کنید که توسط اولین مرورگر نمایش داده می شود: 45282ab12b28b926.png

11. تبریک!

شما از Firebase SDK برای توابع Cloud استفاده کرده اید و اجزای سمت سرور را به یک برنامه چت اضافه کرده اید.

آنچه را پوشش داده ایم

  • نوشتن توابع ابری با استفاده از Firebase SDK برای توابع ابری.
  • عملکردهای Cloud را بر اساس رویدادهای Auth، Cloud Storage و Cloud Firestore فعال کنید.
  • پشتیبانی Firebase Cloud Messaging را به برنامه وب خود اضافه کنید.
  • توابع Cloud را با استفاده از Firebase CLI اجرا کنید.

مراحل بعدی

بیشتر بدانید