ในการเรียก Google Cloud API จากแอป คุณต้องสร้าง REST API ระดับกลางที่จัดการการให้สิทธิ์และปกป้องค่าลับ เช่น คีย์ API จากนั้นคุณต้องเขียนโค้ดในแอปบนอุปกรณ์เคลื่อนที่เพื่อตรวจสอบสิทธิ์และสื่อสารกับบริการระดับกลางนี้
วิธีหนึ่งในการสร้าง REST API นี้คือการใช้ Firebase Authentication and Functions ซึ่งให้เกตเวย์แบบไร้เซิร์ฟเวอร์ที่มีการจัดการแก่คุณไปยัง Google Cloud API ที่จัดการการตรวจสอบสิทธิ์และสามารถเรียกได้จากแอปบนอุปกรณ์เคลื่อนที่ด้วย SDK ที่สร้างไว้ล่วงหน้า
คู่มือนี้สาธิตวิธีใช้เทคนิคนี้เพื่อเรียก Cloud Vision API จากแอปของคุณ วิธีนี้จะอนุญาตให้ผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ทั้งหมดเข้าถึงบริการที่เรียกเก็บเงินของ Cloud Vision ผ่านโครงการคลาวด์ของคุณ ดังนั้นให้พิจารณาว่ากลไกการตรวจสอบสิทธิ์นี้เพียงพอสำหรับกรณีการใช้งานของคุณหรือไม่ก่อนที่จะดำเนินการต่อ
ก่อนที่คุณจะเริ่มต้น
กำหนดค่าโครงการของคุณ
หากคุณยังไม่ได้เพิ่ม Firebase ลงในแอป ให้ทำตามขั้นตอนใน คู่มือเริ่มต้นใช้งานใช้ Swift Package Manager เพื่อติดตั้งและจัดการการอ้างอิง Firebase
- ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Packages
- เมื่อได้รับแจ้ง ให้เพิ่มที่เก็บ Firebase Apple platforms SDK:
- เลือกไลบรารี Firebase ML
- เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ไขและดาวน์โหลดการอ้างอิงของคุณโดยอัตโนมัติในเบื้องหลัง
https://github.com/firebase/firebase-ios-sdk
ถัดไป ทำการตั้งค่าในแอป:
- ในแอปของคุณ ให้นำเข้า Firebase:
สวิฟต์
import FirebaseMLModelDownloader
วัตถุประสงค์-C
@import FirebaseMLModelDownloader;
ขั้นตอนการกำหนดค่าอีกสองสามขั้นตอน และเราพร้อมแล้ว:
หากคุณยังไม่ได้เปิดใช้ API บนคลาวด์สำหรับโครงการของคุณ ให้ดำเนินการทันที:
- เปิด หน้า Firebase ML API ของคอนโซล Firebase
หากคุณยังไม่ได้อัปเกรดโครงการเป็นแผนราคา Blaze ให้คลิก อัปเกรด เพื่อดำเนินการดังกล่าว (คุณจะได้รับแจ้งให้อัปเกรดเฉพาะในกรณีที่โปรเจ็กต์ของคุณไม่ได้อยู่ในแผน Blaze)
โปรเจ็กต์ระดับ Blaze เท่านั้นที่ใช้ API บนคลาวด์ได้
- หากยังไม่ได้เปิดใช้ API บนคลาวด์ ให้คลิก เปิดใช้ API บนคลาวด์
- กำหนดค่าคีย์ Firebase API ที่มีอยู่เพื่อปิดการเข้าถึง Cloud Vision API:
- เปิดหน้า ข้อมูลรับรอง ของ Cloud Console
- สำหรับแต่ละคีย์ API ในรายการ ให้เปิดมุมมองการแก้ไข และในส่วนการจำกัดคีย์ ให้เพิ่ม API ที่มีอยู่ทั้งหมด ยกเว้น Cloud Vision API ลงในรายการ
ปรับใช้ฟังก์ชันที่เรียกได้
จากนั้น ปรับใช้ Cloud Function ที่คุณจะใช้เพื่อเชื่อมโยงแอปของคุณกับ Cloud Vision API ที่เก็บ functions-samples
มีตัวอย่างที่คุณสามารถใช้ได้
ตามค่าเริ่มต้น การเข้าถึง Cloud Vision API ผ่านฟังก์ชันนี้จะอนุญาตเฉพาะผู้ใช้ที่ตรวจสอบสิทธิ์ของแอปของคุณเท่านั้นที่เข้าถึง Cloud Vision API ได้ คุณสามารถปรับเปลี่ยนฟังก์ชันสำหรับความต้องการที่แตกต่างกันได้
ในการปรับใช้ฟังก์ชัน:
- โคลนหรือดาวน์โหลดที่เก็บ ตัวอย่างฟังก์ชั่น และเปลี่ยนเป็นไดเร็กทอรี
vision-annotate-image
:git clone https://github.com/firebase/functions-samples
cd 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 เพื่อติดตั้ง Cloud Functions สำหรับไลบรารี Firebase
1. เตรียมภาพอินพุต
ในการเรียกใช้ Cloud Vision รูปภาพจะต้องจัดรูปแบบเป็นสตริงที่เข้ารหัสแบบ Base64 ในการประมวลผลUIImage
:สวิฟต์
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ขั้นแรก ให้เริ่มต้นอินสแตนซ์ของ Cloud Functions:
สวิฟต์
lazy var functions = Functions.functions()
วัตถุประสงค์-C
@property(strong, nonatomic) FIRFunctions *functions;
สร้างคำขอโดยตั้งค่า Type เป็น
LANDMARK_DETECTION
:สวิฟต์
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"] ]
วัตถุประสงค์-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LANDMARK_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 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
แสดงถึงจุดสังเกตที่รู้จักในรูปภาพ สำหรับจุดสังเกตแต่ละจุด คุณจะได้รับพิกัดขอบเขตในภาพอินพุต ชื่อของจุดสังเกต ละติจูดและลองจิจูด ID เอนทิตีของกราฟความรู้ (ถ้ามี) และคะแนนความเชื่อมั่นของการจับคู่ ตัวอย่างเช่น:
สวิฟต์
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"];
}
}