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. إنشاء طلب مع نوع مجموعة إلى LANDMARK_DETECTION :

    سويفت

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

    ج موضوعية

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LANDMARK_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 سوف تعاد في النتيجة المهمة. كل كائن في 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"];
  }
}