برای فراخوانی یک API گوگل کلود از برنامه خود، باید یک API REST واسط ایجاد کنید که مجوزها را مدیریت کرده و از مقادیر مخفی مانند کلیدهای API محافظت کند. سپس باید در برنامه تلفن همراه خود کدی بنویسید تا احراز هویت شده و با این سرویس واسط ارتباط برقرار کند.
یک راه برای ایجاد این REST API استفاده از Firebase Authentication and Functions است که یک دروازه مدیریتشده و بدون سرور به APIهای Google Cloud در اختیار شما قرار میدهد که احراز هویت را مدیریت میکند و میتوان آن را از طریق برنامه تلفن همراه شما با SDKهای از پیش ساخته شده فراخوانی کرد.
این راهنما نحوه استفاده از این تکنیک را برای فراخوانی API Cloud Vision از برنامه شما نشان میدهد. این روش به همه کاربران احراز هویت شده اجازه میدهد تا از طریق پروژه Cloud شما به سرویسهای دارای صورتحساب Cloud Vision دسترسی پیدا کنند، بنابراین قبل از ادامه، در نظر بگیرید که آیا این مکانیسم احراز هویت برای مورد استفاده شما کافی است یا خیر.
قبل از اینکه شروع کنی
پروژه خود را پیکربندی کنید
اگر هنوز Firebase را به برنامه خود اضافه نکردهاید، با دنبال کردن مراحل موجود در راهنمای شروع به کار ، این کار را انجام دهید.برای نصب و مدیریت وابستگیهای Firebase از Swift Package Manager استفاده کنید.
- در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
- وقتی از شما خواسته شد، مخزن SDK پلتفرمهای اپل فایربیس را اضافه کنید:
- کتابخانه Firebase ML را انتخاب کنید.
- پرچم
-ObjCرا به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید. - پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگیهای شما در پسزمینه میکند.
https://github.com/firebase/firebase-ios-sdk.git
در مرحله بعد، برخی تنظیمات درون برنامهای را انجام دهید:
- در برنامه خود، Firebase را وارد کنید:
سویفت
import FirebaseMLModelDownloader
هدف-سی
@import FirebaseMLModelDownloader;
چند مرحله پیکربندی دیگر، و ما آمادهایم:
اگر هنوز APIهای مبتنی بر ابر را برای پروژه خود فعال نکردهاید، اکنون این کار را انجام دهید:
- صفحه Firebase ML APIs را در کنسول Firebase باز کنید.
اگر هنوز پروژه خود را به طرح قیمتگذاری پرداخت در محل Blaze ارتقا ندادهاید، برای انجام این کار روی ارتقا کلیک کنید. (فقط در صورتی که پروژه شما در طرح قیمتگذاری Blaze نباشد، از شما خواسته میشود که آن را ارتقا دهید.)
فقط پروژههای موجود در طرح قیمتگذاری Blaze میتوانند از APIهای مبتنی بر ابر استفاده کنند.
- اگر APIهای مبتنی بر ابر از قبل فعال نشدهاند، روی فعال کردن APIهای مبتنی بر ابر کلیک کنید.
- کلیدهای API فایربیس موجود خود را پیکربندی کنید تا دسترسی به API کلود ویژن را غیرفعال کنید:
- صفحه اعتبارنامهها (Credentials) کنسول Cloud را باز کنید.
- برای هر کلید API موجود در لیست، نمای ویرایش را باز کنید و در بخش محدودیتهای کلید، تمام APIهای موجود به جز API Cloud Vision را به لیست اضافه کنید.
تابع قابل فراخوانی را مستقر کنید
در مرحله بعد، تابع ابری (Cloud Function) را که برای ایجاد پل بین برنامه خود و API Cloud Vision استفاده خواهید کرد، مستقر کنید. مخزن functions-samples شامل مثالی است که میتوانید از آن استفاده کنید.
به طور پیشفرض، دسترسی به API Cloud Vision از طریق این تابع، فقط به کاربران احراز هویت شده برنامه شما اجازه دسترسی به API Cloud Vision را میدهد. میتوانید این تابع را برای الزامات مختلف تغییر دهید.
برای استقرار تابع:
- مخزن functions-samples را کلون یا دانلود کنید و به دایرکتوری
Node-1st-gen/vision-annotate-imageتغییر دهید:git clone https://github.com/firebase/functions-samplescd Node-1st-gen/vision-annotate-image - نصب وابستگیها:
cd functionsnpm installcd .. - اگر Firebase CLI را ندارید، آن را نصب کنید .
- یک پروژه Firebase را در دایرکتوری
vision-annotate-imageراهاندازی کنید. در صورت درخواست، پروژه خود را از لیست انتخاب کنید.firebase init
- تابع را مستقر کنید:
firebase deploy --only functions:annotateImage
Firebase Auth را به برنامه خود اضافه کنید
تابع فراخوانیشدهی فوق، هرگونه درخواستی از کاربران احراز هویت نشدهی برنامهی شما را رد میکند. اگر قبلاً این کار را انجام ندادهاید، باید Firebase Auth را به برنامهی خود اضافه کنید.
وابستگیهای لازم را به برنامه خود اضافه کنید
برای نصب کتابخانه Cloud Functions for Firebase از Swift Package Manager استفاده کنید.
۱. تصویر ورودی را آماده کنید
برای فراخوانی Cloud Vision، تصویر باید به صورت یک رشته کدگذاری شده با base64 فرمت شود. برای پردازش یکUIImage : سویفت
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
هدف-سی
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
۲. تابع قابل فراخوانی را برای تشخیص نشانههای جغرافیایی فراخوانی کنید
برای تشخیص نشانههای بصری در یک تصویر، تابع قابل فراخوانی را با ارسال یک درخواست JSON Cloud Vision فراخوانی کنید.ابتدا، یک نمونه از توابع ابری را مقداردهی اولیه کنید:
سویفت
lazy var functions = Functions.functions()هدف-سی
@property(strong, nonatomic) FIRFunctions *functions;یک درخواست با نوع
LANDMARK_DETECTIONایجاد کنید:سویفت
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"] ]هدف-سی
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"} };در نهایت، تابع را فراخوانی کنید:
سویفت
do { let result = try await functions.httpsCallable("annotateImage").call(requestData) print(result) } catch { 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] } // ... } }هدف-سی
[[_functions HTTPSCallableWithName:@"annotateImage"] callWithObject:requestData completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { if (error) { if ([error.domain isEqualToString:@"com.firebase.functions"]) { FIRFunctionsErrorCode code = error.code; NSString *message = error.localizedDescription; NSObject *details = error.userInfo[@"details"]; } // ... } // Function completed succesfully // Get information about labeled objects }];
۳. در مورد مکانهای دیدنی شناختهشده اطلاعات کسب کنید
اگر عملیات تشخیص نقطه عطف با موفقیت انجام شود، یک پاسخ JSON از نوع BatchAnnotateImagesResponse در نتیجه وظیفه بازگردانده میشود. هر شیء در آرایه landmarkAnnotations نشان دهنده یک نقطه عطف است که در تصویر تشخیص داده شده است. برای هر نقطه عطف، میتوانید مختصات مرزی آن را در تصویر ورودی، نام نقطه عطف، طول و عرض جغرافیایی آن، شناسه موجودیت نمودار دانش آن (در صورت وجود) و امتیاز اطمینان تطابق را دریافت کنید. به عنوان مثال:
سویفت
if let labelArray = (result?.data as? [String: Any])?["landmarkAnnotations"] as? [[String:Any]] {
for labelObj in labelArray {
let landmarkName = labelObj["description"]
let entityId = labelObj["mid"]
let score = labelObj["score"]
let bounds = labelObj["boundingPoly"]
// Multiple locations are possible, e.g., the location of the depicted
// landmark and the location the picture was taken.
guard let locations = labelObj["locations"] as? [[String: [String: Any]]] else { continue }
for location in locations {
let latitude = location["latLng"]?["latitude"]
let longitude = location["latLng"]?["longitude"]
}
}
}
هدف-سی
NSArray *labelArray = result.data[@"landmarkAnnotations"];
for (NSDictionary *labelObj in labelArray) {
NSString *landmarkName = labelObj[@"description"];
NSString *entityId = labelObj[@"mid"];
NSNumber *score = labelObj[@"score"];
NSArray *bounds = labelObj[@"boundingPoly"];
// Multiple locations are possible, e.g., the location of the depicted
// landmark and the location the picture was taken.
NSArray *locations = labelObj[@"locations"];
for (NSDictionary *location in locations) {
NSNumber *latitude = location[@"latLng"][@"latitude"];
NSNumber *longitude = location[@"latLng"][@"longitude"];
}
}