من أجل استدعاء Google Cloud API من تطبيقك ، تحتاج إلى إنشاء واجهة برمجة تطبيقات REST وسيطة تتعامل مع التفويض وتحمي القيم السرية مثل مفاتيح واجهة برمجة التطبيقات. ستحتاج بعد ذلك إلى كتابة رمز في تطبيق الهاتف المحمول الخاص بك للمصادقة على هذه الخدمة الوسيطة والتواصل معها.
تتمثل إحدى طرق إنشاء واجهة برمجة تطبيقات REST هذه في استخدام مصادقة ووظائف Firebase ، والتي تمنحك بوابة مُدارة بدون خادم إلى Google Cloud APIs التي تتعامل مع المصادقة ويمكن استدعاؤها من تطبيق الجوال الخاص بك باستخدام حزم SDK سابقة الإنشاء.
يوضح هذا الدليل كيفية استخدام هذه التقنية لاستدعاء Cloud Vision API من تطبيقك. ستسمح هذه الطريقة لجميع المستخدمين المعتمدين بالوصول إلى خدمات Cloud Vision التي تتم فوترتها من خلال مشروع Cloud الخاص بك ، لذا ضع في اعتبارك ما إذا كانت آلية المصادقة هذه كافية لحالة الاستخدام الخاصة بك قبل المتابعة.
قبل ان تبدأ
تكوين مشروعك
إذا لم تكن قد أضفت Firebase بالفعل إلى تطبيقك ، فقم بذلك باتباع الخطوات الواردة في دليل البدء .استخدم Swift Package Manager لتثبيت وإدارة تبعيات Firebase.
- في Xcode ، مع فتح مشروع التطبيق الخاص بك ، انتقل إلى ملف> إضافة حزم .
- عند المطالبة ، أضف مستودع SDK لأنظمة Apple الأساسية لـ Firebase:
- اختر مكتبة Firebase ML.
- عند الانتهاء ، سيبدأ Xcode تلقائيًا في حل وتنزيل التبعيات الخاصة بك في الخلفية.
https://github.com/firebase/firebase-ios-sdk
بعد ذلك ، قم بإجراء بعض الإعداد داخل التطبيق:
- في تطبيقك ، استورد Firebase:
سويفت
import FirebaseMLModelDownloader
ج موضوعية
@import FirebaseMLModelDownloader;
بضع خطوات تكوين أخرى ، ونحن على استعداد للذهاب:
إذا لم تكن قد قمت بالفعل بتمكين واجهات برمجة التطبيقات المستندة إلى السحابة لمشروعك ، فقم بذلك الآن:
- افتح صفحة Firebase ML APIs بوحدة تحكم Firebase.
إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze ، فانقر فوق ترقية للقيام بذلك. (ستتم مطالبتك بالترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)
يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.
- إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة ممكّنة بالفعل ، فانقر فوق تمكين واجهات برمجة التطبيقات المستندة إلى السحابة .
- هيئ مفاتيح Firebase API الحالية لعدم السماح بالوصول إلى Cloud Vision API:
- افتح صفحة بيانات الاعتماد الخاصة بوحدة التحكم السحابية.
- لكل مفتاح API في القائمة ، افتح عرض التحرير ، وفي قسم Key Restrictions ، أضف جميع واجهات برمجة التطبيقات المتاحة باستثناء Cloud Vision API إلى القائمة.
انشر الوظيفة القابلة للاستدعاء
بعد ذلك ، انشر وظيفة السحابة التي ستستخدمها لربط تطبيقك بواجهة Cloud Vision API. يحتوي مستودع functions-samples
على مثال يمكنك استخدامه.
بشكل افتراضي ، سيسمح الوصول إلى Cloud Vision API من خلال هذه الوظيفة للمستخدمين المعتمدين فقط من تطبيقك بالوصول إلى Cloud Vision API. يمكنك تعديل الوظيفة لمتطلبات مختلفة.
لنشر الوظيفة:
- استنساخ أو تنزيل عينات الريبو الخاصة بالوظائف والتغيير إلى دليل
Node-1st-gen/vision-annotate-image
:git clone https://github.com/firebase/functions-samples
cd Node-1st-gen/vision-annotate-image
- تثبيت التبعيات:
cd functions
npm install
cd ..
- إذا لم يكن لديك Firebase CLI ، فثبته .
- ابدأ مشروع Firebase في دليل
vision-annotate-image
. عند المطالبة ، حدد مشروعك من القائمة.firebase init
- انشر الوظيفة:
firebase deploy --only functions:annotateImage
أضف Firebase Auth إلى تطبيقك
سترفض الوظيفة القابلة للاستدعاء التي تم نشرها أعلاه أي طلب من المستخدمين غير المصادق عليهم لتطبيقك. إذا لم تكن قد قمت بذلك بالفعل ، فستحتاج إلى إضافة Firebase Auth إلى تطبيقك.
أضف التبعيات الضرورية إلى تطبيقك
استخدم Swift Package Manager لتثبيت وظائف السحابة لمكتبة Firebase.
أنت الآن جاهز لتسمية الصور.
1. تحضير صورة الإدخال
من أجل استدعاء Cloud Vision ، يجب تنسيق الصورة كسلسلة مشفرة base64. لمعالجةUIImage
:سويفت
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
ج موضوعية
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
2. استدعاء الوظيفة القابلة للاستدعاء لتسمية الصورة
لتسمية كائنات في صورة ما ، قم باستدعاء الوظيفة القابلة للاستدعاء لتمرير طلب JSON Cloud Vision .أولاً ، قم بتهيئة مثيل من وظائف السحابة:
سويفت
lazy var functions = Functions.functions()
ج موضوعية
@property(strong, nonatomic) FIRFunctions *functions;
إنشاء طلب مع ضبط النوع على
LABEL_DETECTION
:سويفت
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LABEL_DETECTION"] ]
ج موضوعية
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"} };
أخيرًا ، قم باستدعاء الوظيفة:
سويفت
functions.httpsCallable("annotateImage").call(requestData) { (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] } // ... } // Function completed successfully }
ج موضوعية
[[_functions HTTPSCallableWithName:@"annotateImage"] callWithObject:requestData completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { if (error) { if (error.domain == FIRFunctionsErrorDomain) { FIRFunctionsErrorCode code = error.code; NSString *message = error.localizedDescription; NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey]; } // ... } // Function completed succesfully // Get information about labeled objects }];
3. الحصول على معلومات حول الكائنات المسمى
إذا نجحت عملية تسمية الصورة ، فسيتم إرجاع استجابة JSON لـ BatchAnnotateImagesResponse في نتيجة المهمة. يمثل كل كائن في مصفوفةlabelAnnotations
شيئًا تمت تسميته في الصورة. لكل تصنيف ، يمكنك الحصول على وصف نصي للتسمية ، ومعرف كيان الرسم البياني المعرفي (إن وجد) ، ودرجة الثقة في المطابقة. على سبيل المثال: سويفت
if let labelArray = (result?.data as? [String: Any])?["labelAnnotations"] as? [[String:Any]] {
for labelObj in labelArray {
let text = labelObj["description"]
let entityId = labelObj["mid"]
let confidence = labelObj["score"]
}
}
ج موضوعية
NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
NSString *text = labelObj[@"description"];
NSString *entityId = labelObj[@"mid"];
NSNumber *confidence = labelObj[@"score"];
}