ระบุสถานที่สำคัญอย่างปลอดภัยด้วย Cloud Vision โดยใช้ Firebase Auth และฟังก์ชั่นบนแพลตฟอร์ม Apple

ในการเรียก Google Cloud API จากแอปของคุณ คุณต้องสร้าง REST API ระดับกลางที่จัดการการให้สิทธิ์และปกป้องค่าลับ เช่น คีย์ API จากนั้นคุณจะต้องเขียนโค้ดในแอพมือถือของคุณเพื่อตรวจสอบสิทธิ์และสื่อสารกับบริการระดับกลางนี้

วิธีหนึ่งในการสร้าง REST API นี้คือการใช้ Firebase Authentication and Functions ซึ่งให้เกตเวย์แบบไร้เซิร์ฟเวอร์ที่มีการจัดการไปยัง Google Cloud API ที่จัดการการตรวจสอบสิทธิ์ และสามารถเรียกได้จากแอปบนอุปกรณ์เคลื่อนที่ด้วย SDK ที่สร้างไว้ล่วงหน้า

คู่มือนี้สาธิตวิธีใช้เทคนิคนี้เพื่อเรียก Cloud Vision API จากแอปของคุณ วิธีนี้จะอนุญาตให้ผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ทั้งหมดเข้าถึงบริการที่เรียกเก็บเงิน Cloud Vision ผ่านโปรเจ็กต์ Cloud ของคุณ ดังนั้นให้พิจารณาว่ากลไกการตรวจสอบสิทธิ์นี้เพียงพอสำหรับกรณีการใช้งานของคุณหรือไม่ก่อนดำเนินการต่อ

ก่อนจะเริ่ม

กำหนดค่าโครงการของคุณ

หากคุณยังไม่ได้เพิ่ม Firebase ในแอปของคุณ ให้ทำตามขั้นตอนในคู่มือ การเริ่มต้นใช้ งาน

ใช้ Swift Package Manager เพื่อติดตั้งและจัดการการขึ้นต่อกันของ Firebase

  1. ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Packages
  2. เมื่อได้รับแจ้ง ให้เพิ่มที่เก็บ SDK ของแพลตฟอร์ม Firebase Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. เลือกไลบรารี Firebase ML
  5. เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ไขและดาวน์โหลดการพึ่งพาของคุณในพื้นหลังโดยอัตโนมัติ

ถัดไป ทำการตั้งค่าบางอย่างในแอป:

  1. ในแอปของคุณ ให้นำเข้า Firebase:

    Swift

    import FirebaseMLModelDownloader

    วัตถุประสงค์-C

    @import FirebaseMLModelDownloader;

อีกสองสามขั้นตอนการกำหนดค่า และเราพร้อมแล้ว:

  1. หากคุณยังไม่ได้เปิดใช้งาน API แบบ Cloud-based สำหรับโปรเจ็กต์ของคุณ ให้ดำเนินการดังนี้:

    1. เปิดหน้า Firebase ML APIs ของคอนโซล Firebase
    2. หากคุณยังไม่ได้อัปเกรดโปรเจ็กต์ของคุณเป็นแผนราคา Blaze ให้คลิก อัปเกรด เพื่อดำเนินการดังกล่าว (คุณจะได้รับแจ้งให้อัปเกรดเฉพาะเมื่อโปรเจ็กต์ของคุณไม่อยู่ในแผน Blaze)

      เฉพาะโปรเจ็กต์ระดับ Blaze เท่านั้นที่สามารถใช้ API แบบคลาวด์ได้

    3. หากยังไม่ได้เปิดใช้งาน API แบบคลาวด์ ให้คลิก เปิดใช้งาน API แบบคลาวด์
  2. กำหนดค่าคีย์ Firebase API ที่มีอยู่ของคุณเพื่อไม่อนุญาตให้เข้าถึง Cloud Vision API:
    1. เปิดหน้า ข้อมูลประจำตัว ของคอนโซลระบบคลาวด์
    2. สำหรับคีย์ API แต่ละรายการในรายการ ให้เปิดมุมมองการแก้ไข และในส่วนการจำกัดคีย์ ให้เพิ่ม API ที่มีอยู่ ทั้งหมดยกเว้น Cloud Vision API ลงในรายการ

ปรับใช้ฟังก์ชันที่เรียกได้

ขั้นต่อไป ปรับใช้ Cloud Function ที่คุณจะใช้เพื่อเชื่อมโยงแอปของคุณและ Cloud Vision API ที่เก็บ functions-samples มีตัวอย่างที่คุณสามารถใช้ได้

ตามค่าเริ่มต้น การเข้าถึง Cloud Vision API ผ่านฟังก์ชันนี้จะอนุญาตให้เฉพาะผู้ใช้แอปที่ตรวจสอบสิทธิ์เข้าถึง Cloud Vision API เท่านั้น คุณสามารถปรับเปลี่ยนฟังก์ชันสำหรับข้อกำหนดต่างๆ ได้

ในการปรับใช้ฟังก์ชัน:

  1. โคลนหรือดาวน์โหลด ฟังก์ชั่นตัวอย่าง repo และเปลี่ยนเป็นไดเร็กทอรี 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 ในแอปของคุณ

ฟังก์ชัน callable ที่ปรับใช้ด้านบนจะปฏิเสธคำขอใดๆ จากผู้ใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์ของแอปของคุณ หากยังไม่ได้ดำเนินการ คุณจะต้อง เพิ่ม Firebase Auth ในแอปของคุณ

เพิ่มการพึ่งพาที่จำเป็นให้กับแอปของคุณ

ใช้ Swift Package Manager เพื่อติดตั้ง Cloud Functions for Firebase library

1. เตรียมภาพอินพุต

ในการเรียก Cloud Vision รูปภาพต้องได้รับการจัดรูปแบบเป็นสตริงที่เข้ารหัส base64 ในการประมวลผล UIImage :

Swift

guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
let base64encodedImage = imageData.base64EncodedString()

วัตถุประสงค์-C

NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
NSString *base64encodedImage =
  [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

2. เรียกใช้ฟังก์ชันที่เรียกได้เพื่อจดจำจุดสังเกต

หากต้องการจดจำจุดสังเกตในรูปภาพ ให้เรียกใช้ฟังก์ชันที่เรียกได้ โดย ส่งคำขอ JSON Cloud Vision

  1. ขั้นแรก เริ่มต้นอินสแตนซ์ของ Cloud Functions:

    Swift

    lazy var functions = Functions.functions()
    

    วัตถุประสงค์-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. สร้างคำขอโดยตั้งค่า Type เป็น LANDMARK_DETECTION :

    Swift

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

    วัตถุประสงค์-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"}
    };
    
  3. ในที่สุด เรียกใช้ฟังก์ชัน:

    Swift

    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
    }
    

    วัตถุประสงค์-C

    [[_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 แสดงถึงจุดสังเกตที่เป็นที่รู้จักในรูปภาพ สำหรับจุดสังเกตแต่ละแห่ง คุณสามารถรับพิกัดขอบเขตในรูปภาพที่ป้อน ชื่อของจุดสังเกต ละติจูดและลองจิจูด รหัสเอนทิตีกราฟความรู้ (หากมี) และคะแนนความเชื่อมั่นของการแข่งขัน ตัวอย่างเช่น:

Swift

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

วัตถุประสงค์-C

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