۱. قبل از شروع
برای اطمینان از صحت تعامل کاربران با برنامه وب خود، Firebase App Check را پیادهسازی خواهید کرد که از توکنهای reCAPTCHA JWT برای تأیید جلسات کاربر استفاده میکند. این تنظیمات به شما امکان میدهد تا درخواستهای برنامه کلاینت به Places API (جدید) را به طور ایمن مدیریت کنید.

آنچه خواهید ساخت.
برای نشان دادن این موضوع، یک برنامه وب ایجاد خواهید کرد که هنگام بارگذاری، یک نقشه نمایش میدهد. همچنین این برنامه به طور نامحسوس با استفاده از Firebase SDK یک توکن reCAPTCHA تولید میکند. سپس این توکن به سرور Node.js شما ارسال میشود، جایی که Firebase قبل از انجام هرگونه درخواستی به Places API، آن را اعتبارسنجی میکند.
اگر توکن معتبر باشد، Firebase App Check آن را تا زمان انقضا ذخیره میکند و نیاز به ایجاد توکن جدید برای هر درخواست کلاینت را از بین میبرد. اگر توکن نامعتبر باشد، از کاربر خواسته میشود تا دوباره تأیید reCAPTCHA را برای دریافت توکن جدید انجام دهد.
۲. پیشنیازها
برای تکمیل این Codelab، باید با موارد زیر آشنا شوید. 
محصولات مورد نیاز گوگل کلود
- بررسی برنامه Google Cloud Firebase : پایگاه داده برای مدیریت توکنها
- گوگل ریکپچا : ایجاد و تأیید توکن. این ابزاری است که برای تشخیص انسان از ربات در وبسایتها استفاده میشود. این ابزار با تجزیه و تحلیل رفتار کاربر، ویژگیهای مرورگر و اطلاعات شبکه، امتیازی را ایجاد میکند که احتمال ربات بودن کاربر را نشان میدهد. اگر امتیاز به اندازه کافی بالا باشد، کاربر انسان در نظر گرفته میشود و نیازی به اقدام دیگری نیست. اگر امتیاز پایین باشد، ممکن است یک پازل CAPTCHA برای تأیید هویت کاربر ارائه شود. این رویکرد نسبت به روشهای سنتی CAPTCHA کمتر مزاحم است و تجربه کاربر را روانتر میکند.
- (اختیاری) موتور برنامه ابری گوگل : محیط استقرار.
محصولات مورد نیاز پلتفرم نقشههای گوگل
در این Codelab، از محصولات زیر از پلتفرم نقشههای گوگل استفاده خواهید کرد:
- API جاوا اسکریپت نقشهها در برنامه وب بارگذاری و نمایش داده میشود.
- درخواست Places API (جدید) توسط سرور backend صادر شده است
سایر الزامات برای این Codelab
برای تکمیل این Codelab، به حسابها، سرویسها و ابزارهای زیر نیاز دارید:
- یک حساب کاربری Google Cloud Platform با قابلیت پرداخت فعال
- یک کلید API پلتفرم نقشههای گوگل با API جاوا اسکریپت نقشهها و مکانهای فعال
- دانش پایه در مورد جاوا اسکریپت، HTML و CSS
- دانش اولیه از Node.js
- یک ویرایشگر متن یا IDE دلخواه شما
۳. آماده شوید
راهاندازی پلتفرم نقشههای گوگل
اگر از قبل حساب کاربری پلتفرم گوگل کلود و پروژهای با قابلیت پرداخت صورتحساب ندارید، لطفاً برای ایجاد حساب کاربری و پروژه، به راهنمای شروع به کار با پلتفرم گوگل مپ مراجعه کنید.
- در کنسول ابری ، روی منوی کشویی پروژه کلیک کنید و پروژهای را که میخواهید برای این آزمایشگاه کد استفاده کنید، انتخاب کنید.

- APIها و SDKهای پلتفرم نقشههای گوگل مورد نیاز برای این آزمایشگاه کد را در بازار ابری گوگل فعال کنید. برای انجام این کار، مراحل موجود در این ویدیو یا این مستندات را دنبال کنید.
- یک کلید API در صفحه اعتبارنامههای کنسول ابری ایجاد کنید. میتوانید مراحل موجود در این ویدیو یا این مستندات را دنبال کنید. همه درخواستها به پلتفرم نقشههای گوگل نیاز به یک کلید API دارند.
اعتبارنامههای پیشفرض برنامه
شما از Firebase Admin SDK برای تعامل با پروژه Firebase خود و همچنین ارسال درخواست به Places API استفاده خواهید کرد و برای کار کردن آن باید اعتبارنامههای معتبر ارائه دهید.
ما از احراز هویت ADC (اعتبارنامههای پیشفرض خودکار) برای احراز هویت سرور شما جهت ارسال درخواستها استفاده خواهیم کرد. به عنوان یک روش جایگزین (که توصیه نمیشود) میتوانید یک حساب کاربری سرویس ایجاد کنید و اعتبارنامهها را در کد خود ذخیره کنید.
تعریف : اعتبارنامههای پیشفرض برنامه (ADC) مکانیزمی است که گوگل کلود برای احراز هویت خودکار برنامههای شما بدون مدیریت صریح اعتبارنامهها ارائه میدهد. این مکانیزم به دنبال اعتبارنامهها در مکانهای مختلف (مانند متغیرهای محیطی، فایلهای حساب سرویس یا سرور ابرداده گوگل کلود) میگردد و از اولین موردی که پیدا میکند استفاده میکند.
- در ترمینال خود، از دستور زیر استفاده کنید که به برنامههای شما اجازه میدهد تا به طور ایمن به منابع Google Cloud از طرف کاربر فعلی وارد شده دسترسی پیدا کنند:
gcloud auth application-default login
- شما یک فایل .env در ریشه ایجاد خواهید کرد که یک متغیر Google Cloud Project را مشخص میکند:
GOOGLE_CLOUD_PROJECT="your-project-id"
مدارک جایگزین (توصیه نمیشود)
ایجاد حساب کاربری سرویس
- تب پلتفرم نقشههای گوگل > "+ایجاد اعتبارنامهها" > حساب کاربری سرویس
- نقش مدیر Firebase AppCheck را اضافه کنید، سپس نام حساب سرویس را که تایپ کردهاید وارد کنید، یعنی: firebase-appcheck-codelab@yourproject.iam.gserviceaccount.com
مدارک تحصیلی
- روی حساب سرویس ایجاد شده کلیک کنید
- به تب KEYS بروید و یک کلید ایجاد کنید > JSON > اعتبارنامههای json دانلود شده را ذخیره کنید. فایل xxx.json که به صورت خودکار دانلود شده است را به پوشه ریشه خود منتقل کنید.
- (فصل بعدی) نام آن را به درستی در فایل nodejs به نام server.js (firebase-credentials.json) قرار دهید.
۴. یکپارچهسازی با فایربیس اپچک
شما جزئیات پیکربندی Firebase و کلیدهای مخفی reCAPTCHA را دریافت خواهید کرد.
شما آنها را در برنامه آزمایشی قرار داده و سرور را شروع خواهید کرد.
ایجاد یک برنامه در فایربیس
- به مدیریت پروژه https://console.firebase.google.com بروید ( لینکها را پیدا کنید):
پروژه Google Cloud که قبلاً ایجاد شده است را انتخاب کنید (ممکن است لازم باشد مشخص کنید: "انتخاب منبع والد")


- یک برنامه را از منوی بالا سمت چپ (چرخ دنده) اضافه کنید


کد اولیه سازی فایربیس
- کد مقداردهی اولیه Firebase را ذخیره کنید تا در فایل script.js (فصل بعدی) برای سمت کلاینت قرار دهید.

- برنامه خود را ثبت کنید تا Firebase بتواند از توکنهای reCAPTCHA نسخه ۳ استفاده کند
https://console.firebase.google.com /u/0/project/YOUR_PROJECT/appcheck/apps

- reCAPTCHA را انتخاب کنید → یک کلید در وبسایت reCAPTCHA ایجاد کنید (با دامنههای مناسب پیکربندی شده: localhost برای توسعهدهنده برنامه)


- کد مخفی reCAPTCHA را در Firebase AppCheck جایگذاری کنید

- وضعیت برنامه باید سبز شود

۵. اپلیکیشن نسخه آزمایشی
- اپلیکیشن وب کلاینت: فایلهای HTML، جاوا اسکریپت، CSS
- سرور: فایل Node.js
- محیط (.env): کلیدهای API
- پیکربندی (app.yaml): تنظیمات استقرار موتور برنامه گوگل
تنظیمات Node.js:
- پیمایش : ترمینال خود را باز کنید و به دایرکتوری ریشه پروژه کلون شده خود بروید.
- نصب Node.js (در صورت نیاز) : نسخه ۱۸ یا بالاتر.
node -v # Check installed version
- مقداردهی اولیه پروژه: دستور زیر را برای مقداردهی اولیه یک پروژه جدید Node.js اجرا کنید و همه تنظیمات را به صورت پیشفرض باقی بگذارید:
npm init
- نصب وابستگیها: برای نصب وابستگیهای مورد نیاز پروژه از دستور زیر استفاده کنید:
npm install @googlemaps/places firebase-admin express axios dotenv
پیکربندی: متغیرهای محیطی برای پروژه ابری گوگل
- ایجاد فایل محیط: در دایرکتوری ریشه پروژه خود، فایلی با نام
.envایجاد کنید. این فایل دادههای پیکربندی حساس را ذخیره میکند و نباید به کنترل نسخه اختصاص داده شود. - متغیرهای محیطی را پر کنید: فایل
.envرا باز کنید و متغیرهای زیر را اضافه کنید، و متغیرهای جایگزین را با مقادیر واقعی از پروژه Google Cloud خود جایگزین کنید:
# Google Cloud Project ID
GOOGLE_CLOUD_PROJECT="your-cloud-project-id"
# reCAPTCHA Keys (obtained in previous steps)
RECAPTCHA_SITE_KEY="your-recaptcha-site-key"
RECAPTCHA_SECRET_KEY="your-recaptcha-secret-key"
# Maps Platform API Keys (obtained in previous steps)
PLACES_API_KEY="your-places-api-key"
MAPS_API_KEY="your-maps-api-key"
۶. مرور کلی کد
فهرست.html
- کتابخانههای فایربیس را برای ایجاد توکن در برنامه بارگذاری میکند.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Places API with AppCheck</title>
<style></style> </head>
<body>
<div id="map"></div>
<!-- Firebase services -->
<script src="https://www.gstatic.com/firebasejs/9.15.0/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.15.0/firebase-app-check-compat.js"></script>
<script type="module" src="./script.js"></script>
<link rel="stylesheet" href="./style.css">
</body>
</html>
اسکریپت.js
- دریافت کلیدهای API: کلیدهای API مربوط به نقشههای گوگل و بررسی برنامهی فایربیس را از یک سرور بکاند دریافت میکند.
- Firebase را مقداردهی اولیه میکند: Firebase را برای احراز هویت و امنیت تنظیم میکند. (پیکربندی را جایگزین کنید → به فصل ۴ مراجعه کنید).
مدت اعتبار توکن Firebase App Check، از 30 دقیقه تا 7 روز، در کنسول Firebase پیکربندی شده است و با تلاش برای بهروزرسانی اجباری توکن، قابل تغییر نیست.
- فعالسازی بررسی برنامه: بررسی برنامه Firebase را برای تأیید صحت درخواستهای ورودی فعال میکند.
- بارگذاری API نقشههای گوگل: کتابخانه جاوا اسکریپت نقشههای گوگل را به صورت پویا بارگذاری میکند تا نقشه را نمایش دهد.
- نقشه را مقداردهی اولیه میکند: یک نقشه گوگل با محوریت یک مکان پیشفرض ایجاد میکند.
- کنترل کلیکهای نقشه: کلیکهای روی نقشه را بررسی کرده و نقطه مرکزی را بر اساس آن بهروزرسانی میکند.
- API مربوط به مکانهای جستجو: درخواستهایی را به یک API بکاند (
/api/data) ارسال میکند تا با استفاده از Firebase App Check برای احراز هویت، اطلاعات مربوط به مکانها (رستورانها، پارکها، بارها) نزدیک مکان کلیکشده را دریافت کند. - نمایش نشانگرها: دادههای واکشیشده را روی نقشه به صورت نشانگر رسم میکند و نام و نمادهای آنها را نشان میدهد.
let mapsApiKey, recaptchaKey; // API keys
let currentAppCheckToken = null; // AppCheck token
async function init() {
try {
await fetchConfig(); // Load API keys from .env variable
/////////// REPLACE with your Firebase configuration details
const firebaseConfig = {
apiKey: "AIza.......",
authDomain: "places.......",
projectId: "places.......",
storageBucket: "places.......",
messagingSenderId: "17.......",
appId: "1:175.......",
measurementId: "G-CPQ.......",
};
/////////// REPLACE
// Initialize Firebase and App Check
await firebase.initializeApp(firebaseConfig);
await firebase.appCheck().activate(recaptchaKey);
// Get the initial App Check token
currentAppCheckToken = await firebase.appCheck().getToken();
// Load the Maps JavaScript API dynamically
const scriptMaps = document.createElement("script");
scriptMaps.src = `https://maps.googleapis.com/maps/api/js?key=${mapsApiKey}&libraries=marker,places&v=beta`;
scriptMaps.async = true;
scriptMaps.defer = true;
scriptMaps.onload = initMap; // Create the map after the script loads
document.head.appendChild(scriptMaps);
} catch (error) {
console.error("Firebase initialization error:", error);
// Handle the error appropriately (e.g., display an error message)
}
}
window.onload = init()
// Fetch configuration data from the backend API
async function fetchConfig() {
const url = "/api/config";
try {
const response = await fetch(url);
const config = await response.json();
mapsApiKey = config.mapsApiKey;
recaptchaKey = config.recaptchaKey;
} catch (error) {
console.error("Error fetching configuration:", error);
// Handle the error (e.g., show a user-friendly message)
}
}
// Initialize the map when the Maps API script loads
let map; // Dynamic Map
let center = { lat: 48.85557501, lng: 2.34565006 };
function initMap() {
map = new google.maps.Map(document.getElementById("map"), {
center: center,
zoom: 13,
mapId: "b93f5cef6674c1ff",
zoomControlOptions: {
position: google.maps.ControlPosition.RIGHT_TOP,
},
streetViewControl: false,
mapTypeControl: false,
clickableIcons: false,
fullscreenControlOptions: {
position: google.maps.ControlPosition.LEFT_TOP,
},
});
// Initialize the info window for markers
infoWindow = new google.maps.InfoWindow({});
// Add a click listener to the map
map.addListener("click", async (event) => {
try {
// Get a fresh App Check token on each click
const appCheckToken = await firebase.appCheck().getToken();
currentAppCheckToken = appCheckToken;
// Update the center for the Places API query
center.lat = event.latLng.lat();
center.lng = event.latLng.lng();
// Query for places with the new token and center
queryPlaces();
} catch (error) {
console.error("Error getting App Check token:", error);
}
});
}
function queryPlaces() {
const url = '/api/data'; // "http://localhost:3000/api/data"
const body = {
request: {
includedTypes: ['restaurant', 'park', 'bar'],
excludedTypes: [],
maxResultCount: 20,
locationRestriction: {
circle: {
center: {
latitude: center.lat,
longitude: center.lng,
},
radius: 4000,
},
},
},
};
// Provides token to the backend using header: X-Firebase-AppCheck
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Firebase-AppCheck': currentAppCheckToken.token,
},
body: JSON.stringify(body),
})
.then((response) => response.json())
.then((data) => {
// display if response successful
displayMarkers(data.places);
})
.catch((error) => {
alert('No places');
// eslint-disable-next-line no-console
console.error('Error:', error);
});
}
//// display places markers on map
...
سرور.js
- متغیرهای محیطی (کلیدهای API، شناسه پروژه گوگل) را از یک فایل
.envبارگذاری میکند. - سرور را شروع میکند و به درخواستهای روی
http://localhost:3000گوش میدهد. - کیت توسعه نرمافزار مدیریت فایربیس (Firebase Admin SDK) را با استفاده از اعتبارنامههای پیشفرض برنامه (ADC) مقداردهی اولیه میکند .
- یک توکن reCAPTCHA از
script.jsدریافت میکند. - اعتبار توکن دریافتی را تأیید میکند.
- اگر توکن معتبر باشد، یک درخواست POST به API مکانهای گوگل (Google Places API) با پارامترهای جستجو ارسال میکند .
- پاسخ دریافتی از Places API را پردازش کرده و به کلاینت برمیگرداند .
const express = require('express');
const axios = require('axios');
const admin = require('firebase-admin');
// .env variables
require('dotenv').config();
// Store sensitive API keys in environment variables
const recaptchaSite = process.env.RECAPTCHA_SITE_KEY;
const recaptchaSecret = process.env.RECAPTCHA_SECRET_KEY;
const placesApiKey = process.env.PLACES_API_KEY;
const mapsApiKey = process.env.MAPS_API_KEY;
// Verify environment variables loaded (only during development)
console.log('recaptchaSite:', recaptchaSite, '\n');
console.log('recaptchaSecret:', recaptchaSecret, '\n');
const app = express();
app.use(express.json());
// Firebase Admin SDK setup with Application Default Credentials (ADC)
const { GoogleAuth } = require('google-auth-library');
admin.initializeApp({
// credential: admin.credential.applicationDefault(), // optional: explicit ADC
});
// Main API Endpoint
app.post('/api/data', async (req, res) => {
const appCheckToken = req.headers['x-firebase-appcheck'];
console.log("\n", "Token", "\n", "\n", appCheckToken, "\n")
try {
// Verify Firebase App Check token for security
const appCheckResult = await admin.appCheck().verifyToken(appCheckToken);
if (appCheckResult.appId) {
console.log('App Check verification successful!');
placesQuery(req, res);
} else {
console.error('App Check verification failed.');
res.status(403).json({ error: 'App Check verification failed.' });
}
} catch (error) {
console.error('Error verifying App Check token:', error);
res.status(500).json({ error: 'Error verifying App Check token.' });
}
});
// Function to query Google Places API
async function placesQuery(req, res) {
console.log('#################################');
console.log('\n', 'placesApiKey:', placesApiKey, '\n');
const queryObject = req.body.request;
console.log('\n','Request','\n','\n', queryObject, '\n')
const headers = {
'Content-Type': 'application/json',
'X-Goog-FieldMask': '*',
'X-Goog-Api-Key': placesApiKey,
'Referer': 'http://localhost:3000', // Update for production(ie.: req.hostname)
};
const myUrl = 'https://places.googleapis.com/v1/places:searchNearby';
try {
// Authenticate with ADC
const auth = new GoogleAuth();
const { credential } = await auth.getApplicationDefault();
const response = await axios.post(myUrl, queryObject, { headers, auth: credential });
console.log('############### SUCCESS','\n','\n','Response','\n','\n', );
const myBody = response.data;
myBody.places.forEach(place => {
console.log(place.displayName);
});
res.json(myBody); // Use res.json for JSON data
} catch (error) {
console.log('############### ERROR');
// console.error(error); // Log the detailed error for debugging
res.status(error.response.status).json(error.response.data); // Use res.json for errors too
}
}
// Configuration endpoint (send safe config data to the client)
app.get('/api/config', (req, res) => {
res.json({
mapsApiKey: process.env.MAPS_API_KEY,
recaptchaKey: process.env.RECAPTCHA_SITE_KEY,
});
});
// Serve static files
app.use(express.static('static'));
// Start the server
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server listening on port ${port}`, '\n');
});
۷. برنامه را اجرا کنید
از محیط انتخابی خود، دستور server را از ترمینال اجرا کنید و به آدرس http://localhost:3000 بروید.
npm start
یک توکن به عنوان یک متغیر سراسری ایجاد میشود، از پنجره مرورگر کاربر پنهان است و برای پردازش به سرور منتقل میشود. جزئیات توکن را میتوان در لاگهای سرور یافت. | جزئیات مربوط به عملکردهای سرور و پاسخ به درخواست جستجوی مکانهای نزدیک API را میتوان در گزارشهای سرور یافت. |
عیبیابی:
مطمئن شوید که شناسه پروژه گوگل (Google Project ID) در تنظیمات یکسان باشد:
- در فایل .env (متغیر GOOGLE_CLOUD_PROJECT)
- در پیکربندی ترمینال gcloud:
gcloud config set project your-project-id
- در تنظیمات reCaptcha

- در تنظیمات فایربیس

دیگر
- یک توکن اشکالزدایی ایجاد کنید که بتوان از آن به جای کلید سایت reCAPTCHA در
script.jsبرای اهداف آزمایش و عیبیابی استفاده کرد.

try {
// Initialize Firebase first
await firebase.initializeApp(firebaseConfig);
// Set the debug token
if (window.location.hostname === 'localhost') { // Only in development
await firebase.appCheck().activate(
'YOUR_DEBUG_FIREBASE_TOKEN', // Replace with the token from the console
true // Set to true to indicate it's a debug token
);
} else {
// Activate App Check
await firebase.appCheck().activate(recaptchaKey);
}
- تلاش زیاد برای احراز هویت ناموفق، مثلاً استفاده از کلید سایت recaptcha نادرست، ممکن است باعث ایجاد انسداد موقت شود.
FirebaseError: AppCheck: Requests throttled due to 403 error. Attempts allowed again after 01d:00m:00s (appCheck/throttled).
اعتبارنامههای ADC
- مطمئن شوید که در حساب کاربری gcloud صحیح هستید
gcloud auth login
- مطمئن شوید که کتابخانههای لازم نصب شدهاند
npm install @googlemaps/places firebase-admin
- مطمئن شوید که کتابخانه Firebase در server.js بارگذاری شده است.
const {GoogleAuth} = require('google-auth-library');
- توسعه محلی : تنظیم ADC
gcloud auth application-default login
- جعل هویت: اعتبارنامههای ADC ذخیره شد
gcloud auth application-default login --impersonate-service-account your_project@appspot.gserviceaccount.com
- در نهایت، ADC را به صورت محلی تست کنید، اسکریپت زیر را با نام test.js ذخیره کنید و در ترمینال اجرا کنید:
node test.js
const {GoogleAuth} = require('google-auth-library');
async function requestTestADC() {
try {
// Authenticate using Application Default Credentials (ADC)
const auth = new GoogleAuth();
const {credential} = await auth.getApplicationDefault();
// Check if the credential is successfully obtained
if (credential) {
console.log('Application Default Credentials (ADC) loaded successfully!');
console.log('Credential:', credential); // Log the credential object
} else {
console.error('Error: Could not load Application Default Credentials (ADC).');
}
// ... rest of your code ...
} catch (error) {
console.error('Error:', error);
}
}
requestTestADC();
۸. آفرین! آفرین!
مراحل پیگیری
استقرار در موتور برنامه:
- پروژه خود را برای استقرار در Google App Engine آماده کنید و هرگونه تغییر پیکربندی لازم را انجام دهید.
- برای استقرار برنامه خود از ابزار خط فرمان
gcloudیا کنسول App Engine استفاده کنید.
بهبود احراز هویت فایربیس:
- توکنهای پیشفرض در مقابل توکنهای سفارشی: پیادهسازی توکنهای سفارشی فایربیس برای استفاده عمیقتر از سرویسهای فایربیس.
- طول عمر توکن: طول عمر مناسب توکن را تنظیم کنید، برای عملیات حساس کوتاهتر (توکن سفارشی Firebase تا یک ساعت)، و برای جلسات عمومی طولانیتر (توکن reCAPTCHA: 30 دقیقه تا 7 ساعت).
- جایگزینهای reCAPTCHA را بررسی کنید: بررسی کنید که آیا DeviceCheck (iOS)، SafetyNet (Android) یا App Attest برای نیازهای امنیتی شما مناسب هستند یا خیر.
ادغام محصولات Firebase:
- پایگاه داده بلادرنگ یا Firestore: اگر برنامه شما به همگامسازی دادههای بلادرنگ یا قابلیتهای آفلاین نیاز دارد، آن را با پایگاه داده بلادرنگ یا Firestore ادغام کنید.
- فضای ذخیرهسازی ابری: از فضای ذخیرهسازی ابری برای ذخیره و ارائه محتوای تولید شده توسط کاربر مانند تصاویر یا ویدیوها استفاده کنید.
- احراز هویت: از احراز هویت Firebase برای ایجاد حسابهای کاربری، مدیریت جلسات ورود به سیستم و مدیریت بازنشانی رمز عبور استفاده کنید.
گسترش به موبایل:
- اندروید و iOS: اگر قصد دارید یک اپلیکیشن موبایل داشته باشید، نسخههایی را برای هر دو پلتفرم اندروید و iOS ایجاد کنید.
- کیتهای توسعه نرمافزار فایربیس: از کیتهای توسعه نرمافزار فایربیس برای اندروید و iOS برای ادغام یکپارچه ویژگیهای فایربیس در برنامههای تلفن همراه خود استفاده کنید.

