کیتهای توسعه نرمافزار مشتری Cloud Functions for Firebase به شما امکان میدهند توابع را مستقیماً از برنامه Firebase فراخوانی کنید. برای فراخوانی تابع از برنامهتان به این روش، تابع HTTP Callable را در Cloud Functions بنویسید و پیادهسازی کنید، و سپس منطق مشتری را برای فراخوانی تابع از برنامهتان اضافه کنید.
مهم است بهخاطر داشته باشید که توابع فراخوانشدنی HTTP مشابه توابع HTTP هستند اما با آنها یکسان نیستند. برای استفاده از توابع فراخوانشدنی HTTP باید از کیت توسعه نرمافزار کارخواه برای پلاتفرم خود همراه با میانای برنامهسازی کاربردی زیرینه استفاده کنید (یا پروتکل را پیادهسازی کنید). توابع فراخوانپذیر این تفاوتهای کلیدی را با توابع HTTP دارند:
- با «فراخوانها»، Firebase Authentication نشان، FCM نشان، و App Check نشان، درصورت دردسترس بودن، بهطور خودکار در درخواستها گنجانده میشوند.
- راهانداز بهطور خودکار بدنه درخواست را واسریال میکند و نشانهای اصالتسنجی را اعتبارسنجی میکند.
«کیت توسعه نرمافزار Firebase» برای Cloud Functions نسل دوم و بالاتر با این حداقل نسخههای «کیت توسعه نرمافزار» کارخواه Firebase تعاملپذیر است تا از توابع «فراخوانشدنی HTTPS» پشتیبانی کند:
- Firebase کیت توسعه نرمافزار برای Apple پلاتفرم 13.0.0
- Firebase کیت توسعه نرمافزار برای Android نسخه ۲۲.۱.۱
- کیت توسعه نرمافزار وب واحد Firebase نسخه ۹.۷.۰
اگر میخواهید قابلیت مشابهی به برنامهای که در پلاتفرم پشتیبانینشدهای ساخته شده است اضافه کنید، مشخصات پروتکل برای https.onCall را ببینید. بقیه این راهنما دستورالعملهایی درباره نحوه نوشتن، استقرار، و فراخوانی تابع فراخوان HTTP برای پلاتفرمهای Apple، Android، وب، ++C، و Unity ارائه میدهد.
نوشتن و استقرار تابع فراخواندنی
از functions.https.onCall
برای ایجاد تابع فراخوان HTTPS استفاده کنید. این روش
دو پارامتر میگیرد: data، و context اختیاری:
// Saves a message to the Firebase Realtime Database but sanitizes the // text by removing swearwords. exports.addMessage = functions.https.onCall((data, context) => { // ... });
برای تابع فراخوانیپذیری که پیامک را در Realtime Database ذخیره میکند،
برای مثال، data میتواند حاوی نوشتار پیام باشد، درحالیکه context
پارامترها نشاندهنده اطلاعات اصالتسنجی کاربر است:
// Message text passed from the client.
const text = request.data.text;
// Authentication / user information is automatically added to the request.
const uid = request.auth.uid;
const name = request.auth.token.name || null;
const picture = request.auth.token.picture || null;
const email = request.auth.token.email || null;
فاصله بین مکان تابع فراخواندنی و مکان کارخواه فراخوان میتواند تأخیر شبکه ایجاد کند. برای بهینهسازی عملکرد، درصورت امکان، مکان تابع را مشخص کنید، و مطمئن شوید مکان فراخواندنی با مکانی که هنگام مقداردهی اولیه کیت توسعه نرمافزار در سمت مشتری تنظیم کردهاید هماهنگ باشد.
بهصورت اختیاری، میتوانید App Check گواهی را پیوست کنید تا به محافظت از منابع پشتیبان خود دربرابر سوءاستفاده، مانند کلاهبرداری صورتحساب یا رمزگیری، کمک کنید. فعال کردن اجرای App Check برای Cloud Functions را ببینید.
درحال ارسال نتیجه
برای ارسال دادهها به مشتری، دادههایی را برگردانید که بتواند با JSON کدبندی شود. برای مثال، برای برگرداندن نتیجه یک عملیات جمع:
// returning result.
return {
firstNumber: firstNumber,
secondNumber: secondNumber,
operator: "+",
operationResult: firstNumber + secondNumber,
};
برای برگرداندن دادهها پساز عملیات ناهمزمان، یک وعده برگردانید. دادههای برگرداندهشده توسط وعده به مشتری برگردانده میشود. برای مثال، میتوانید نوشتار پاکسازیشدهای را که تابع فراخوانپذیر در Realtime Database نوشته است برگردانید:
// Saving the new message to the Realtime Database.
const sanitizedMessage = sanitizer.sanitizeText(text); // Sanitize message.
return getDatabase().ref("/messages").push({
text: sanitizedMessage,
author: {uid, name, picture, email},
}).then(() => {
logger.info("New Message written");
// Returning the sanitized message to the client.
return {text: sanitizedMessage};
})
مدیریت خطاها
برای اطمینان از اینکه مشتری جزئیات خطای مفید دریافت میکند، خطاها را از یک فراخوانپذیر
با پرتاب کردن (یا برگرداندن یک «وعده» ردشده با) نمونهای از
functions.https.HttpsError برگردانید.
این خطا دارای مشخصه code است که میتواند یکی از مقادیر فهرستشده در
functions.https.HttpsError باشد.
خطاها همچنین رشته message را دارند که بهطور پیشفرض
به رشتهای خالی تنظیم میشود. همچنین میتواند فیلد اختیاری details با مقدار
دلخواه داشته باشد. اگر خطایی بهجز HttpsError از توابع شما پرتاب شود،
بهجای آن، مشتری شما خطایی با پیام INTERNAL و کد
internal دریافت میکند.
برای مثال، تابعی میتواند خطاهای اعتبارسنجی داده و اصالتسنجی را با پیامهای خطا به مشتری تماسگیرنده برگرداند:
// Checking attribute.
if (!(typeof text === "string") || text.length === 0) {
// Throwing an HttpsError so that the client gets the error details.
throw new HttpsError("invalid-argument", "The function must be called " +
"with one arguments \"text\" containing the message text to add.");
}
// Checking that the user is authenticated.
if (!request.auth) {
// Throwing an HttpsError so that the client gets the error details.
throw new HttpsError("failed-precondition", "The function must be " +
"called while authenticated.");
}
استقرار تابع فراخوانشدنی
پساز اینکه تابع آماده تماس را در index.js ذخیره کردید، وقتی firebase deploy را اجرا میکنید، این تابع همراه با همه توابع دیگر استقرار مییابد.
برای پیاده کردن فقط تماسگرفتنی، از آرگومان --only همانطور که نشان داده شده است برای انجام
پیادهسازیهای جزئی استفاده کنید:
firebase deploy --only functions:addMessage
اگر هنگام استقرار توابع با خطاهای اجازه مواجه شدید، مطمئن شوید که نقشهای IAM مناسب به کاربری که دستورات استقرار را اجرا میکند اختصاص داده شده است.
راهاندازی محیط توسعه کارخواه
مطمئن شوید که پیشنیازها را برآورده میکنید، سپس وابستگیهای لازم و کتابخانههای کارخواه را به برنامهتان اضافه کنید.
iOS+
دستورالعملهای افزودن Firebase به برنامه Apple را دنبال کنید.
از «مدیر بسته Swift» برای نصب و مدیریت وابستگیهای Firebase استفاده کنید.
- در Xcode، با باز بودن پروژه برنامه، به File > Add Packages (فایل > افزودن بستهها) پیمایش کنید.
- وقتی درخواست شد، مخزن کیت توسعه نرمافزار پلاتفرمهای Firebase Apple را اضافه کنید:
- کتابخانه Cloud Functions را انتخاب کنید.
- پرچم
-ObjCرا به بخش پرچمهای پیونددهنده دیگر در تنظیمات ساخت هدف اضافه کنید. - پساز اتمام، Xcode بهطور خودکار شروع به حل و بارگیری وابستگیهای شما در پسزمینه میکند.
https://github.com/firebase/firebase-ios-sdk.git
Web
- دستورالعملهای
افزودن Firebase به برنامه وب را دنبال کنید. حتماً
فرمان زیر را از پایانه اجرا کنید:
npm install firebase@12.19.0 --save
بهصورت دستی هم Firebase core و هم Cloud Functions را الزامی کنید:
import { initializeApp } from 'firebase/app'; import { getFunctions } from 'firebase/functions'; const app = initializeApp({ projectId: '### CLOUD FUNCTIONS PROJECT ID ###', apiKey: '### FIREBASE API KEY ###', authDomain: '### FIREBASE AUTH DOMAIN ###', }); const functions = getFunctions(app);
Web
- دستورالعملهای افزودن Firebase به برنامه وب را دنبال کنید.
- کتابخانههای اصلی Firebase و Cloud Functions مشتری را به
برنامهتان اضافه کنید:
<script src="https://www.gstatic.com/firebasejs/8.10.1/firebase.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-functions.js"></script>
«کیت توسعه نرمافزار Cloud Functions» بهعنوان بسته npm نیز دردسترس است.
- فرمان زیر را از پایانه خود اجرا کنید:
npm install firebase@8.10.1 --save
- بهصورت دستی هم Firebase core و هم Cloud Functions را الزامی کنید:
const firebase = require("firebase"); // Required for side-effects require("firebase/functions");
Kotlin
دستورالعملهای افزودن Firebase به برنامه Android را دنبال کنید.
در فایل Gradle واحد (سطح برنامه) (معمولاً
<project>/<app-module>/build.gradle.ktsیا<project>/<app-module>/build.gradle)، وابستگی کتابخانه Cloud Functions را برای Android اضافه کنید. توصیه میکنیم از Firebase Android BoM برای کنترل نسخهبندی کتابخانه استفاده کنید.dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.19.0")) // Add the dependency for the Cloud Functions library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-functions") }
بااستفاده از Firebase Android BoM، برنامه شما همیشه از نسخههای سازگار کتابخانههای Firebase Android استفاده خواهد کرد.
(جایگزین) افزودن وابستگیهای کتابخانه Firebase بدون استفاده از BoM
اگر انتخاب کنید که از Firebase BoM استفاده نکنید، باید نسخه هر کتابخانه Firebase را در خط وابستگی آن مشخص کنید.
توجه داشته باشید که اگر از چند کتابخانه Firebase در برنامهتان استفاده میکنید، قویاً توصیه میکنیم از BoM برای مدیریت نسخههای کتابخانه استفاده کنید، که تضمین میکند همه نسخهها سازگار باشند.
dependencies { // Add the dependency for the Cloud Functions library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-functions:22.1.1") }
Java
دستورالعملهای افزودن Firebase به برنامه Android را دنبال کنید.
در فایل Gradle واحد (سطح برنامه) (معمولاً
<project>/<app-module>/build.gradle.ktsیا<project>/<app-module>/build.gradle)، وابستگی کتابخانه Cloud Functions را برای Android اضافه کنید. توصیه میکنیم از Firebase Android BoM برای کنترل نسخهبندی کتابخانه استفاده کنید.dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.19.0")) // Add the dependency for the Cloud Functions library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-functions") }
بااستفاده از Firebase Android BoM، برنامه شما همیشه از نسخههای سازگار کتابخانههای Firebase Android استفاده خواهد کرد.
(جایگزین) افزودن وابستگیهای کتابخانه Firebase بدون استفاده از BoM
اگر انتخاب کنید که از Firebase BoM استفاده نکنید، باید نسخه هر کتابخانه Firebase را در خط وابستگی آن مشخص کنید.
توجه داشته باشید که اگر از چند کتابخانه Firebase در برنامهتان استفاده میکنید، قویاً توصیه میکنیم از BoM برای مدیریت نسخههای کتابخانه استفاده کنید، که تضمین میکند همه نسخهها سازگار باشند.
dependencies { // Add the dependency for the Cloud Functions library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-functions:22.1.1") }
Dart
برای افزودن Firebase به برنامه Flutter، دستورالعملها را دنبال کنید.
از ریشه پروژه Flutter خود، فرمان زیر را برای نصب افزایه اجرا کنید:
flutter pub add cloud_functionsپساز تکمیل، برنامه Flutter خود را بازسازی کنید:
flutter runپساز نصب، میتوانید با وارد کردن
cloud_functionsافزایه در کد Dart خود به آن دسترسی پیدا کنید:import 'package:cloud_functions/cloud_functions.dart';
C++
برای C++ با Android:
- دستورالعملهای افزودن Firebase به پروژه C++ را دنبال کنید.
- کتابخانه
firebase_functionsرا به فایلCMakeLists.txtخود اضافه کنید.
برای C++ با پلاتفرمهای Apple:
- دستورالعملهای افزودن Firebase به پروژه C++ را دنبال کنید.
- پاد Cloud Functions را به
Podfileاضافه کنید:pod 'Firebase/Functions'
- فایل را ذخیره کنید، سپس این را اجرا کنید:
pod install
- چارچوبهای اصلی Firebase و Cloud Functions را از
Firebase C++ SDK به پروژه Xcode خود اضافه کنید.
firebase.frameworkfirebase_functions.framework
Unity
- دستورالعملهای افزودن Firebase به پروژه Unity را دنبال کنید.
-
FirebaseFunctions.unitypackageرا از Firebase Unity SDK به پروژه Unity خود اضافه کنید.
مقداردهی اولیه کیت توسعه نرمافزار مشتری
مقداردهی اولیه نمونهای از Cloud Functions:
Swift
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
// ...
self.functions = [FIRFunctions functions];
Web
firebase.initializeApp({
apiKey: '### FIREBASE API KEY ###',
authDomain: '### FIREBASE AUTH DOMAIN ###',
projectId: '### CLOUD FUNCTIONS PROJECT ID ###'
databaseURL: 'https://### YOUR DATABASE NAME ###.firebaseio.com',
});
// Initialize Cloud Functions through Firebase
var functions = firebase.functions();
Web
const app = initializeApp({
projectId: '### CLOUD FUNCTIONS PROJECT ID ###',
apiKey: '### FIREBASE API KEY ###',
authDomain: '### FIREBASE AUTH DOMAIN ###',
});
const functions = getFunctions(app);
Kotlin
private lateinit var functions: FirebaseFunctions // ... functions = Firebase.functions
Java
private FirebaseFunctions mFunctions; // ... mFunctions = FirebaseFunctions.getInstance();
Dart
final functions = FirebaseFunctions.instance;
C++
firebase::functions::Functions* functions;
// ...
functions = firebase::functions::Functions::GetInstance(app);
Unity
functions = Firebase.Functions.DefaultInstance;
فراخوانی تابع
Swift
functions.httpsCallable("addMessage").call(["text": inputField.text]) { result, error in
if let error = error as NSError? {
if error.domain == FunctionsErrorDomain {
let code = FunctionsErrorCode(rawValue: error.code)
let message = error.localizedDescription
let details = error.userInfo[FunctionsErrorDetailsKey]
}
// ...
}
if let data = result?.data as? [String: Any], let text = data["text"] as? String {
self.resultField.text = text
}
}
Objective-C
[[_functions HTTPSCallableWithName:@"addMessage"] callWithObject:@{@"text": _inputField.text}
completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
if (error) {
if ([error.domain isEqual:@"com.firebase.functions"]) {
FIRFunctionsErrorCode code = error.code;
NSString *message = error.localizedDescription;
NSObject *details = error.userInfo[@"details"];
}
// ...
}
self->_resultField.text = result.data[@"text"];
}];
Web
var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
.then((result) => {
// Read result of the Cloud Function.
var sanitizedMessage = result.data.text;
});
Web
import { getFunctions, httpsCallable } from "firebase/functions";
const functions = getFunctions();
const addMessage = httpsCallable(functions, 'addMessage');
addMessage({ text: messageText })
.then((result) => {
// Read result of the Cloud Function.
/** @type {any} */
const data = result.data;
const sanitizedMessage = data.text;
});
Kotlin
private fun addMessage(text: String): Task<String> { // Create the arguments to the callable function. val data = hashMapOf( "text" to text, "push" to true, ) return functions .getHttpsCallable("addMessage") .call(data) .continueWith { task -> // This continuation runs on either success or failure, but if the task // has failed then result will throw an Exception which will be // propagated down. val result = task.result?.data as String result } }
Java
private Task<String> addMessage(String text) { // Create the arguments to the callable function. Map<String, Object> data = new HashMap<>(); data.put("text", text); data.put("push", true); return mFunctions .getHttpsCallable("addMessage") .call(data) .continueWith(new Continuation<HttpsCallableResult, String>() { @Override public String then(@NonNull Task<HttpsCallableResult> task) throws Exception { // This continuation runs on either success or failure, but if the task // has failed then getResult() will throw an Exception which will be // propagated down. String result = (String) task.getResult().getData(); return result; } }); }
Dart
final result = await FirebaseFunctions.instance.httpsCallable('addMessage').call(
{
"text": text,
"push": true,
},
);
_response = result.data as String;
C++
firebase::Future<firebase::functions::HttpsCallableResult> AddMessage(
const std::string& text) {
// Create the arguments to the callable function.
firebase::Variant data = firebase::Variant::EmptyMap();
data.map()["text"] = firebase::Variant(text);
data.map()["push"] = true;
// Call the function and add a callback for the result.
firebase::functions::HttpsCallableReference doSomething =
functions->GetHttpsCallable("addMessage");
return doSomething.Call(data);
}
Unity
private Task<string> addMessage(string text) {
// Create the arguments to the callable function.
var data = new Dictionary<string, object>();
data["text"] = text;
data["push"] = true;
// Call the function and extract the operation from the result.
var function = functions.GetHttpsCallable("addMessage");
return function.CallAsync(data).ContinueWith((task) => {
return (string) task.Result.Data;
});
}
مدیریت خطاها در کارخواه
اگر سرور خطا ایجاد کند یا اگر وعده حاصل رد شود، کارخواه خطا دریافت میکند.
اگر خطای برگشتی از تابع از نوع function.https.HttpsError باشد،
کارخواه خطای code، message، و details را از خطای سرور دریافت میکند. درغیراینصورت، خطا حاوی پیام INTERNAL و کد INTERNAL است. راهنمای نحوه
مدیریت خطاها در تابع فراخواندنی را ببینید.
Swift
if let error = error as NSError? {
if error.domain == FunctionsErrorDomain {
let code = FunctionsErrorCode(rawValue: error.code)
let message = error.localizedDescription
let details = error.userInfo[FunctionsErrorDetailsKey]
}
// ...
}
Objective-C
if (error) {
if ([error.domain isEqual:@"com.firebase.functions"]) {
FIRFunctionsErrorCode code = error.code;
NSString *message = error.localizedDescription;
NSObject *details = error.userInfo[@"details"];
}
// ...
}
Web
var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
.then((result) => {
// Read result of the Cloud Function.
var sanitizedMessage = result.data.text;
})
.catch((error) => {
// Getting the Error details.
var code = error.code;
var message = error.message;
var details = error.details;
// ...
});
Web
import { getFunctions, httpsCallable } from "firebase/functions";
const functions = getFunctions();
const addMessage = httpsCallable(functions, 'addMessage');
addMessage({ text: messageText })
.then((result) => {
// Read result of the Cloud Function.
/** @type {any} */
const data = result.data;
const sanitizedMessage = data.text;
})
.catch((error) => {
// Getting the Error details.
const code = error.code;
const message = error.message;
const details = error.details;
// ...
});
Kotlin
addMessage(inputMessage) .addOnCompleteListener { task -> if (!task.isSuccessful) { val e = task.exception if (e is FirebaseFunctionsException) { val code = e.code val details = e.details } } }
Java
addMessage(inputMessage) .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Exception e = task.getException(); if (e instanceof FirebaseFunctionsException) { FirebaseFunctionsException ffe = (FirebaseFunctionsException) e; FirebaseFunctionsException.Code code = ffe.getCode(); Object details = ffe.getDetails(); } } } });
Dart
try {
final result =
await FirebaseFunctions.instance.httpsCallable('addMessage').call();
} on FirebaseFunctionsException catch (error) {
print(error.code);
print(error.details);
print(error.message);
}
C++
void OnAddMessageCallback(
const firebase::Future<firebase::functions::HttpsCallableResult>& future) {
if (future.error() != firebase::functions::kErrorNone) {
// Function error code, will be kErrorInternal if the failure was not
// handled properly in the function call.
auto code = static_cast<firebase::functions::Error>(future.error());
// Display the error in the UI.
DisplayError(code, future.error_message());
return;
}
const firebase::functions::HttpsCallableResult* result = future.result();
firebase::Variant data = result->data();
// This will assert if the result returned from the function wasn't a string.
std::string message = data.string_value();
// Display the result in the UI.
DisplayResult(message);
}
// ...
// ...
auto future = AddMessage(message);
future.OnCompletion(OnAddMessageCallback);
// ...
Unity
addMessage(text).ContinueWith((task) => {
if (task.IsFaulted) {
foreach (var inner in task.Exception.InnerExceptions) {
if (inner is FunctionsException) {
var e = (FunctionsException) inner;
// Function error code, will be INTERNAL if the failure
// was not handled properly in the function call.
var code = e.ErrorCode;
var message = e.ErrorMessage;
}
}
} else {
string result = task.Result;
}
});
تنظیم زمان اتمام کارخواه
بهطور پیشفرض، کیتهای توسعه نرمافزار کارخواه Cloud Functions برای
درخواستهای فراخوانپذیر از مهلت زمانی ۷۰ ثانیهای استفاده میکنند. اگر تکمیل یک تابع فراخوانشدنی بیشتر از ۷۰ ثانیه طول بکشد،
کیت توسعه نرمافزار کارخواه درخواست را با خطای DEADLINE_EXCEEDED
(deadline-exceeded) خاتمه میدهد—حتی اگر زمان اتمام سمت سرور طولانیتری را پیکربندی کرده باشید.
برای پشتیبانی از توابع فراخوانشدنی طولانیمدت، باید زمان اتمام را در هر دو سرور و کارخواه افزایش دهید:
- زمان اتمام عملکرد سمت سرور را افزایش دهید (به تنظیم زمان اتمام و تخصیص حافظه مراجعه کنید).
- هنگام پیکربندی مرجع فراخوان در برنامهتان، درنگ سمت کارخواه را افزایش دهید:
Swift
let callable = functions.httpsCallable("addMessage")
callable.timeoutInterval = 300 // 300 seconds (default is 70)
let result = try await callable.call(["text": text, "push": true])
Objective-C
FIRHTTPSCallable *callable = [self.functions HTTPSCallableWithName:@"addMessage"];
callable.timeoutInterval = 300; // 300 seconds (default is 70)
[callable callWithObject:@{@"text": text, @"push": @YES}
completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
// ...
}];
Web
var addMessage = firebase.functions().httpsCallable('addMessage', {
timeout: 300000, // 300 seconds in milliseconds (default is 70000)
});
addMessage({ text: messageText })
.then((result) => {
// ...
});
Web
import { getFunctions, httpsCallable } from "firebase/functions";
const functions = getFunctions();
const addMessage = httpsCallable(functions, 'addMessage', {
timeout: 300000, // 300 seconds in milliseconds (default is 70000)
});
const result = await addMessage({ text: messageText });
Kotlin
val callable = functions.getHttpsCallable("addMessage")
callable.setTimeout(300L, TimeUnit.SECONDS)
val result = callable.call(data).await()
Java
HttpsCallableReference callable = mFunctions.getHttpsCallable("addMessage");
callable.setTimeout(300L, TimeUnit.SECONDS);
Task<HttpsCallableResult> result = callable.call(data);
Dart
final callable = FirebaseFunctions.instance.httpsCallable(
'addMessage',
options: HttpsCallableOptions(
timeout: const Duration(seconds: 300),
),
);
final result = await callable.call({
'text': text,
'push': true,
});
توصیهشده: با App Check از سوءاستفاده جلوگیری کنید
قبلاز راهاندازی برنامه، باید App Check را فعال کنید تا مطمئن شوید فقط برنامههای شما میتوانند به نقطههای پایانی تابع فراخوانشدنی دسترسی داشته باشند.