Catch up on everthing we announced at this year's Firebase Summit. Learn more

قم بتسمية الصور بأمان باستخدام Cloud Vision باستخدام مصادقة Firebase والوظائف على أنظمة Apple الأساسية

من أجل استدعاء Google Cloud API من تطبيقك ، تحتاج إلى إنشاء واجهة برمجة تطبيقات REST وسيطة تتعامل مع التفويض وتحمي القيم السرية مثل مفاتيح واجهة برمجة التطبيقات. تحتاج بعد ذلك إلى كتابة رمز في تطبيق الهاتف المحمول الخاص بك للمصادقة على هذه الخدمة الوسيطة والتواصل معها.

تتمثل إحدى طرق إنشاء واجهة برمجة تطبيقات REST هذه في استخدام مصادقة ووظائف Firebase ، والتي تمنحك بوابة مُدارة بدون خادم إلى Google Cloud APIs التي تتعامل مع المصادقة ويمكن استدعاؤها من تطبيق الهاتف المحمول الخاص بك باستخدام حزم SDK سابقة الإنشاء.

يوضح هذا الدليل كيفية استخدام هذه التقنية لاستدعاء Cloud Vision API من تطبيقك. ستسمح هذه الطريقة لجميع المستخدمين المعتمدين بالوصول إلى خدمات Cloud Vision التي تتم فوترتها من خلال مشروع Cloud الخاص بك ، لذلك ضع في اعتبارك ما إذا كانت آلية المصادقة هذه كافية لحالة الاستخدام الخاصة بك قبل المتابعة.

قبل ان تبدأ

تكوين مشروعك

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

استخدم Swift Package Manager لتثبيت وإدارة تبعيات Firebase.

  1. في كسكودي، مع مشروع التطبيق فتح، انتقل إلى ملف> حزم سويفت> إضافة حزمة التبعية.
  2. عند المطالبة ، قم بإضافة مستودع SDK لأنظمة Firebase Apple الأساسية:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. اختر مكتبة Firebase ML.
  5. عند الانتهاء ، سيبدأ Xcode تلقائيًا في حل وتنزيل التبعيات الخاصة بك في الخلفية.

بعد ذلك ، قم بإجراء بعض الإعداد داخل التطبيق:

  1. في تطبيقك ، استورد Firebase:

    سويفت

    import Firebase

    ج موضوعية

    @import Firebase;

بضع خطوات تكوين أخرى ، ونحن على استعداد للذهاب:

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

    1. فتح الصفحة Firebase ML اجهات برمجة التطبيقات من وحدة التحكم Firebase.
    2. إذا لم تكن بالفعل ترقية المشروع الخاص بك إلى خطة التسعير الحريق، انقر فوق ترقية للقيام بذلك. (ستتم مطالبتك بالترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)

      يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.

    3. إذا لم يتم تمكين واجهات برمجة التطبيقات السحابية، بالفعل، انقر فوق تمكين واجهات برمجة التطبيقات السحابية.
  2. هيئ مفاتيح Firebase API الحالية لعدم السماح بالوصول إلى Cloud Vision API:
    1. فتح وثائق التفويض صفحة من وحدة السحب.
    2. لكل مفتاح API في القائمة، فتح شاشة عرض التحرير، وفي قسم القيود الرئيسية، إضافة كل من واجهات برمجة التطبيقات المتاحة باستثناء API سحابة الرؤية إلى القائمة.

انشر الوظيفة القابلة للاستدعاء

بعد ذلك ، انشر وظيفة السحابة التي ستستخدمها لربط تطبيقك وواجهة Cloud Vision API. و functions-samples يحتوي المستودع على سبيل المثال يمكنك استخدامها.

بشكل افتراضي ، سيسمح الوصول إلى Cloud Vision API من خلال هذه الوظيفة للمستخدمين المعتمدين فقط من تطبيقك بالوصول إلى Cloud Vision API. يمكنك تعديل الوظيفة لمتطلبات مختلفة.

لنشر الوظيفة:

  1. استنساخ أو تنزيل ظائف عينات الريبو وتغيير في vision-annotate-image الدليل:
    git clone https://github.com/firebase/functions-samples
    cd vision-annotate-image
    
  2. تثبيت تبعيات:
    cd functions
    npm install
    cd ..
    
  3. إذا لم يكن لديك Firebase CLI، تثبيته .
  4. تهيئة مشروع Firebase في vision-annotate-image الدليل. عند المطالبة ، حدد مشروعك من القائمة.
    firebase init
  5. نشر وظيفة:
    firebase deploy --only functions:annotateImage

أضف Firebase Auth إلى تطبيقك

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

أضف التبعيات الضرورية إلى تطبيقك

استخدم 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 سحابة الرؤية .

  1. أولاً ، قم بتهيئة مثيل من وظائف السحابة:

    سويفت

    lazy var functions = Functions.functions()
    

    ج موضوعية

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. إنشاء طلب مع نوع مجموعة إلى LABEL_DETECTION :

    سويفت

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["maxResults": 5, "type": "LABEL_DETECTION"]
    ]
    

    ج موضوعية

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"}
    };
    
  3. أخيرًا ، قم باستدعاء الوظيفة:

    سويفت

    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 succesfully
    }
    

    ج موضوعية

    [[_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 مجموعة يمثل شيئا وصفت في الصورة. لكل تسمية، يمكنك الحصول على وصف التسمية النص، في ID كيان الرسم البياني المعرفة (إن وجد)، والنتيجة الثقة من المباراة. على سبيل المثال:

سويفت

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"];
}