如要從應用程式呼叫 Google Cloud API,您必須建立中介 REST API,以便處理授權並保護 API 金鑰等機密值。接著,您需要在行動應用程式中編寫程式碼,以便驗證並與這項中介服務通訊。
您可以使用 Firebase 驗證和功能,透過受管理的無伺服器閘道建立這個 REST API,以便存取 Google Cloud API,處理驗證作業,並透過預先建構的 SDK 從行動應用程式呼叫。
本指南將說明如何使用這項技術,從應用程式呼叫 Cloud Vision API。此方法可讓所有已驗證的使用者透過您的 Cloud 專案存取 Cloud Vision 收費服務,因此請先考量這項驗證機制是否足以滿足您的用途,再繼續操作。
事前準備
設定專案
如果您尚未在應用程式中加入 Firebase,請按照入門指南中的步驟操作。使用 Swift Package Manager 安裝及管理 Firebase 依附元件。
- 在 Xcode 中保持開啟應用程式專案,然後依序點選「File」(檔案) 和「Add Packages」(新增 Package)。
- 系統提示時,請新增 Firebase Apple 平台 SDK 存放區:
- 選擇 Firebase ML 程式庫。
- 將
-ObjC
標記新增至目標的建構設定「Other Linker Flags」部分。 - 完成後,Xcode 就會自動開始在背景中解析並下載依附元件。
https://github.com/firebase/firebase-ios-sdk.git
接下來,請執行一些應用程式內設定:
- 在應用程式中匯入 Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
再完成幾個設定步驟,就可以開始使用了:
-
如果您尚未為專案啟用雲端 API,請立即進行:
- 在 Firebase 控制台中開啟 Firebase ML API 頁面。
-
如果您尚未將專案升級至即付即用 Blaze 定價方案,請按一下「Upgrade」進行升級 (只有在專案未採用 Blaze 定價方案時,系統才會提示您升級)。
只有採用 Blaze 定價方案的專案才能使用雲端 API。
- 如果您尚未啟用雲端 API,請按一下「啟用雲端 API」。
- 設定現有的 Firebase API 金鑰,禁止存取 Cloud Vision API:
部署可呼叫的函式
接著,部署您要用來連結應用程式和 Cloud Vision API 的 Cloud 函式。functions-samples
存放區包含您可以使用的範例。
根據預設,透過這個函式存取 Cloud Vision API 時,只有已驗證的應用程式使用者才能存取 Cloud Vision API。您可以視需要修改函式。
如何部署函式:
- 複製或下載 functions-samples 存放區,然後變更為
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,請安裝。
- 在
vision-annotate-image
目錄中初始化 Firebase 專案。系統顯示提示時,請在清單中選取所需專案。firebase init
- 部署函式:
firebase deploy --only functions:annotateImage
將 Firebase Auth 新增至應用程式
上方部署的可呼叫函式會拒絕應用程式中未經驗證的使用者提出的任何要求。如果您尚未這麼做,請在應用程式中新增 Firebase Auth。
為應用程式新增必要的依附元件
使用 Swift Package Manager 安裝 Cloud Functions for Firebase 程式庫。
您現在可以開始為圖片加上標籤。
1. 準備輸入圖片
如要呼叫 Cloud Vision,圖片必須以 base64 編碼字串的格式呈現。如何處理UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
2. 呼叫可呼叫函式來標示圖片
如要為圖片中的物件加上標籤,請呼叫可呼叫的函式,並傳遞 JSON Cloud Vision 要求。首先,請初始化 Cloud Functions 的例項:
Swift
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
建立要求,並將「Type」設為
LABEL_DETECTION
:Swift
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LABEL_DETECTION"] ]
Objective-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"} };
最後,請叫用函式:
Swift
do { let result = try await functions.httpsCallable("annotateImage").call(requestData) print(result) } catch { 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] } // ... } }
Objective-C
[[_functions HTTPSCallableWithName:@"annotateImage"] callWithObject:requestData completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { if (error) { if ([error.domain isEqualToString:@"com.firebase.functions"]) { FIRFunctionsErrorCode code = error.code; NSString *message = error.localizedDescription; NSObject *details = error.userInfo[@"details"]; } // ... } // Function completed succesfully // Get information about labeled objects }];
3. 取得標記物件的相關資訊
如果圖片標記作業成功,工作結果會傳回 BatchAnnotateImagesResponse 的 JSON 回應。labelAnnotations
陣列中的每個物件都代表圖片中標示的項目。您可以為每個標籤取得標籤的文字說明、知識圖實體 ID (如有),以及比對的信心分數。例如:
Swift
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"]
}
}
Objective-C
NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
NSString *text = labelObj[@"description"];
NSString *entityId = labelObj[@"mid"];
NSNumber *confidence = labelObj[@"score"];
}