وظائف السحابة لـ Firebase

1. نظرة عامة

في مختبر الشفرات هذا ، ستتعلم كيفية استخدام Firebase SDK لوظائف Google Cloud لتحسين تطبيق Chat Web وكيفية استخدام Cloud Functions لإرسال إشعارات إلى مستخدمي تطبيق Chat.

3b1284f5144b54f6.png

ماذا ستتعلم

  • أنشئ وظائف Google Cloud باستخدام Firebase SDK.
  • Trigger Cloud Functions استنادًا إلى أحداث المصادقة والتخزين السحابي و Cloud Firestore.
  • أضف دعم Firebase Cloud Messaging إلى تطبيق الويب الخاص بك.

ماذا ستحتاج

  • بطاقة ائتمان. تتطلب وظائف السحابة لـ Firebase خطة Firebase Blaze ، مما يعني أنه سيتعين عليك تمكين الفوترة في مشروع Firebase باستخدام بطاقة ائتمان.
  • محرر النصوص IDE / الذي تختاره مثل WebStorm أو Atom أو Sublime .
  • محطة لتشغيل أوامر shell مع تثبيت NodeJS v9.
  • متصفح مثل Chrome.
  • نموذج التعليمات البرمجية. انظر الخطوة التالية لهذا.

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

من أجل استخدام وظائف السحابة لـ Firebase ، سيتعين عليك ترقية مشروع Firebase إلى خطة فوترة Blaze . سيتطلب ذلك منك إضافة بطاقة ائتمان أو أداة فوترة أخرى إلى حساب Google Cloud الخاص بك.

لا يزال بإمكان جميع مشاريع Firebase ، بما في ذلك تلك الموجودة في خطة Blaze ، الوصول إلى حصص الاستخدام المجانية لوظائف السحابة. تقع الخطوات الموضحة في مختبر الرموز هذا ضمن حدود الاستخدام المجاني للطبقة. ومع ذلك ، سترى رسومًا صغيرة ( حوالي 0.03 دولار ) من التخزين السحابي والتي تُستخدم لاستضافة صور إنشاء وظائف السحابة.

إذا لم يكن لديك وصول إلى بطاقة ائتمان أو كنت غير مرتاح لمتابعة خطة Blaze ، ففكر في استخدام Firebase Emulator Suite الذي سيسمح لك بمحاكاة وظائف السحابة مجانًا على جهازك المحلي.

تمكين Google Auth

للسماح للمستخدمين بتسجيل الدخول إلى التطبيق ، سنستخدم مصادقة Google التي يجب تمكينها.

في Firebase Console ، افتح قسم الإنشاء > المصادقة > علامة تبويب طريقة تسجيل الدخول (أو انقر هنا للذهاب إلى هناك). بعد ذلك ، قم بتمكين موفر تسجيل الدخول إلى Google وانقر فوق حفظ . سيسمح هذا للمستخدمين بتسجيل الدخول على تطبيق الويب بحساباتهم على Google.

أيضًا ، لا تتردد في تعيين اسم الواجهة العامة لتطبيقك على Friendly Chat :

8290061806aacb46.png

تفعيل التخزين السحابي

يستخدم التطبيق Cloud Storage لتحميل الصور. لتمكين Cloud Storage في مشروع Firebase الخاص بك ، قم بزيارة قسم التخزين وانقر على زر البدء . انتقل من خلال الخطوات هناك ، وبالنسبة لموقع Cloud Storage ، ستكون هناك قيمة افتراضية لاستخدامها. انقر فوق تم بعد ذلك.

أضف تطبيق ويب

في Firebase Console ، أضف تطبيق ويب. للقيام بذلك ، انتقل إلى إعدادات المشروع وانتقل لأسفل إلى إضافة التطبيق . اختر الويب كنظام أساسي وحدد المربع الخاص بإعداد Firebase Hosting ، ثم قم بتسجيل التطبيق وانقر فوق التالي لبقية الخطوات ، وأخيرًا انقر فوق متابعة إلى وحدة التحكم .

4. قم بتثبيت واجهة سطر أوامر Firebase

تتيح لك واجهة سطر أوامر Firebase (CLI) خدمة تطبيق الويب محليًا ونشر تطبيق الويب ووظائف السحابة.

لتثبيت أو ترقية CLI ، قم بتشغيل الأمر npm التالي:

npm -g install firebase-tools

للتحقق من تثبيت CLI بشكل صحيح ، افتح وحدة التحكم وقم بتشغيل:

firebase --version

تأكد من أن إصدار Firebase CLI أعلى من 4.0.0 بحيث يحتوي على أحدث الميزات المطلوبة لوظائف السحابة. إذا لم يكن الأمر كذلك ، فقم بتشغيل npm install -g firebase-tools للترقية كما هو موضح أعلاه.

قم بتفويض Firebase CLI من خلال تشغيل:

firebase login

تأكد من أنك في دليل cloud-functions-start ، ثم قم بإعداد Firebase CLI لاستخدام مشروع Firebase الخاص بك:

firebase use --add

بعد ذلك ، حدد معرف المشروع الخاص بك واتبع التعليمات. عند مطالبتك بذلك ، يمكنك اختيار أي اسم مستعار ، مثل 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. افتحه. من المفترض أن ترى واجهة مستخدم تعمل لتطبيق الدردشة.

سجّل الدخول إلى التطبيق باستخدام زر تسجيل الدخول باستخدام GOOGLE ولا تتردد في إضافة بعض الرسائل ونشر الصور:

3b1284f5144b54f6.png

إذا قمت بتسجيل الدخول إلى التطبيق لأول مرة من متصفح جديد ، فتأكد من السماح بالإشعارات عند مطالبتك بذلك: 8b9d0c66dc36153d.png

سنحتاج إلى تمكين الإشعارات في وقت لاحق.

إذا قمت بالنقر فوق حظر عن طريق الخطأ ، فيمكنك تغيير هذا الإعداد بالنقر فوق الزر 🔒 Secure الموجود على يسار عنوان URL في Chrome Omnibar وتبديل الشريط بجوار الإشعارات :

e926868b0546ed71.png

الآن ، سنضيف بعض الوظائف باستخدام Firebase SDK لوظائف السحابة.

6. دليل الوظائف

تتيح لك وظائف السحابة الحصول بسهولة على رمز يتم تشغيله في السحابة دون الحاجة إلى إعداد خادم. سنستعرض كيفية إنشاء وظائف تتفاعل مع أحداث قاعدة بيانات Firebase Auth و Cloud Storage و Firebase Firestore. لنبدأ بـ Auth.

عند استخدام Firebase SDK لوظائف السحابة ، سيعيش رمز الوظائف الخاص بك ضمن دليل functions (افتراضيًا). كود الوظائف الخاص بك هو أيضًا تطبيق Node.js وبالتالي يحتاج إلى package.json التي تقدم بعض المعلومات حول تطبيقك وتسرد التبعيات.

لتسهيل الأمر عليك ، قمنا بالفعل بإنشاء ملف functions/index.js حيث ستذهب شفرتك. لا تتردد في فحص هذا الملف قبل المضي قدمًا.

cd functions
ls

إذا لم تكن معتادًا على Node.js ، فسيكون من المفيد معرفة المزيد عنها قبل متابعة برنامج codelab.

يسرد ملف package.json بالفعل اثنين من التبعيات المطلوبة: Firebase SDK لوظائف السحابة و 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.

سنقوم باستيراد الوحدات المطلوبة ثم كتابة ثلاث وظائف بدلاً من TODOs. لنبدأ باستيراد وحدات العقدة المطلوبة.

7. استيراد وظائف السحابة ووحدات إدارة Firebase

ستكون هناك حاجة إلى وحدتين خلال مختبر الرموز هذا: تتيح firebase-functions firebase كتابة مشغلات وسجلات وظائف السحابة بينما يمكّن 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 ضمن قسم الإنشاء . يجب أن تشاهد مجموعة الرسائل ومستندًا واحدًا يحتوي على الرسالة التي كتبتها:

442c9c10b5e2b245.png

كما ترى ، يتم تخزين رسائل الدردشة في Cloud Firestore كمستند مع إضافة سمات name و profilePicUrl text timestamp إلى مجموعة messages .

مضيفا رسائل ترحيب

تضيف وظيفة السحابة الأولى رسالة ترحب بالمستخدمين الجدد في الدردشة. لهذا ، يمكننا استخدام 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 ، حيث يتم تخزين رسائل الدردشة.

نظرًا لأن هذه عملية غير متزامنة ، فنحن بحاجة إلى إرجاع الوعد الذي يشير إلى وقت انتهاء Cloud Firestore من الكتابة حتى لا يتم تنفيذ وظائف السحابة في وقت مبكر جدًا.

نشر وظائف السحابة

لن تكون وظائف السحابة نشطة إلا بعد نشرها. للقيام بذلك ، قم بتشغيل هذا في سطر الأوامر:

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 Console وحذف حسابك من قائمة المستخدمين. ثم قم بتسجيل الدخول مرة أخرى.

262535d1b1223c65.png

  1. بعد تسجيل الدخول ، من المفترض أن يتم عرض رسالة ترحيب تلقائيًا:

1c70e0d64b23525b.png

9. الاعتدال في الصور

يمكن للمستخدمين تحميل جميع أنواع الصور في الدردشة ، ومن المهم دائمًا تعديل الصور المسيئة ، خاصة في المنصات الاجتماعية العامة. في FriendlyChat ، يتم تخزين الصور التي يتم نشرها في الدردشة في Google Cloud Storage .

باستخدام وظائف السحابة ، يمكنك اكتشاف عمليات تحميل جديدة للصور باستخدام functions.storage().onFinalize trigger. سيتم تشغيل هذا في كل مرة يتم فيها تحميل ملف جديد أو تعديله في Cloud Storage.

لتعديل الصور ، سنخوض العملية التالية:

  1. تحقق مما إذا تم وضع علامة على الصورة على أنها للبالغين أو عنيفة باستخدام Cloud Vision API .
  2. إذا تم وضع علامة على الصورة ، فقم بتنزيلها على مثيل Functions قيد التشغيل.
  3. طمس الصورة باستخدام ImageMagick .
  4. قم بتحميل الصورة غير الواضحة إلى Cloud Storage.

قم بتمكين Cloud Vision API

نظرًا لأننا سنستخدم Google Cloud Vision API في هذه الوظيفة ، يجب عليك تمكين واجهة برمجة التطبيقات في مشروع Firebase الخاص بك. اتبع هذا الرابط ، ثم حدد مشروع Firebase الخاص بك وقم بتمكين واجهة برمجة التطبيقات:

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 jobs.storage.onChange Cloud Functions ، الذي يقوم بتشغيل التعليمات البرمجية بمجرد إنشاء ملف أو مجلد أو تعديله في حاوية التخزين السحابي. أضف وظيفة 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 ، ​​ويتم إعادة تحميل النسخة غير الواضحة على حاوية التخزين. بعد ذلك ، نحذف الملف الموجود في مثيل وظائف السحابة لتحرير بعض مساحة القرص ، ونقوم بذلك لأنه يمكن إعادة استخدام نفس مثيل وظائف السحابة وإذا لم يتم تنظيف الملفات ، فقد تنفد مساحة القرص. أخيرًا ، أضفنا قيمة منطقية إلى رسالة الدردشة تشير إلى أن الصورة كانت خاضعة للإشراف ، وسيؤدي ذلك إلى تحديث الرسالة على العميل.

انشر الوظيفة

لن تكون الوظيفة نشطة إلا بعد نشرها. في سطر الأوامر ، قم بتشغيل 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. إخطارات الرسائل الجديدة

في هذا القسم ، ستضيف وظيفة سحابية ترسل إشعارات إلى المشاركين في الدردشة عند نشر رسالة جديدة.

باستخدام 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 للوظائف السحابية وأضفت مكونات من جانب الخادم إلى تطبيق دردشة.

ما غطينا

  • تأليف وظائف السحابة باستخدام Firebase SDK لوظائف السحابة.
  • Trigger Cloud Functions استنادًا إلى أحداث المصادقة والتخزين السحابي و Cloud Firestore.
  • أضف دعم Firebase Cloud Messaging إلى تطبيق الويب الخاص بك.
  • انشر وظائف السحابة باستخدام Firebase CLI.

الخطوات التالية

يتعلم أكثر