アプリからGoogleCloudAPIを呼び出すには、承認を処理し、APIキーなどのシークレット値を保護する中間RESTAPIを作成する必要があります。次に、この中間サービスを認証して通信するために、モバイルアプリにコードを記述する必要があります。
このRESTAPIを作成する1つの方法は、Firebase Authentication and Functionsを使用することです。これにより、認証を処理し、ビルド済みのSDKを使用してモバイルアプリから呼び出すことができる、GoogleCloudAPIへの管理されたサーバーレスゲートウェイが提供されます。
このガイドでは、この手法を使用してアプリからCloudVisionAPIを呼び出す方法を示します。この方法では、認証されたすべてのユーザーがCloudプロジェクトを介してCloud Visionの課金サービスにアクセスできるようになるため、先に進む前に、この認証メカニズムがユースケースに十分かどうかを検討してください。
あなたが始める前に
プロジェクトを構成する
まだFirebaseをアプリに追加していない場合は、スタートガイドの手順に従って追加してください。Swift Package Managerを使用して、Firebaseの依存関係をインストールおよび管理します。
- Xcodeで、アプリプロジェクトを開いた状態で、 [ファイル]>[パッケージの追加]に移動します。
- プロンプトが表示されたら、FirebaseAppleプラットフォームSDKリポジトリを追加します。
- FirebaseMLライブラリを選択します。
- 完了すると、Xcodeは自動的に依存関係の解決とダウンロードをバックグラウンドで開始します。
https://github.com/firebase/firebase-ios-sdk
次に、アプリ内セットアップを実行します。
- アプリで、Firebaseをインポートします。
迅速
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
さらにいくつかの構成手順を実行すると、準備が整います。
プロジェクトでクラウドベースのAPIをまだ有効にしていない場合は、今すぐ有効にしてください。
- FirebaseコンソールのFirebaseMLAPIページを開きます。
プロジェクトをまだBlaze料金プランにアップグレードしていない場合は、[アップグレード]をクリックしてアップグレードします。 (プロジェクトがBlazeプランに含まれていない場合にのみ、アップグレードするように求められます。)
BlazeレベルのプロジェクトのみがクラウドベースのAPIを使用できます。
- クラウドベースのAPIがまだ有効になっていない場合は、[クラウドベースのAPIを有効にする]をクリックします。
- CloudVisionAPIへのアクセスを禁止するように既存のFirebaseAPIキーを構成します。
- クラウドコンソールの[資格情報]ページを開きます。
- リスト内のAPIキーごとに、編集ビューを開き、[キーの制限]セクションで、CloudVisionAPIを除く使用可能なすべてのAPIをリストに追加します。
呼び出し可能な関数をデプロイする
次に、アプリとCloudVisionAPIのブリッジに使用するCloudFunctionをデプロイします。 functions-samples
リポジトリには、使用できる例が含まれています。
デフォルトでは、この関数を介してCloud Vision APIにアクセスすると、アプリの認証されたユーザーのみがCloudVisionAPIにアクセスできます。さまざまな要件に合わせて関数を変更できます。
関数をデプロイするには:
- 関数のクローンを作成するかダウンロードします-サンプルリポジトリを作成し、
vision-annotate-image
ディレクトリに変更します:git clone https://github.com/firebase/functions-samples
cd vision-annotate-image
- インストールの依存関係:
cd functions
npm install
cd ..
- Firebase CLIをお持ちでない場合は、インストールしてください。
-
vision-annotate-image
ディレクトリでFirebaseプロジェクトを初期化します。プロンプトが表示されたら、リストからプロジェクトを選択します。firebase init
- 関数をデプロイします:
firebase deploy --only functions:annotateImage
アプリにFirebaseAuthを追加する
上記でデプロイされた呼び出し可能関数は、アプリの認証されていないユーザーからのリクエストを拒否します。まだ行っていない場合は、FirebaseAuthをアプリに追加する必要があります。
アプリに必要な依存関係を追加する
Swift Package Managerを使用して、Cloud FunctionsforFirebaseライブラリをインストールします。
これで、画像にラベルを付ける準備ができました。
1.入力画像を準備します
Cloud Visionを呼び出すには、画像をbase64でエンコードされた文字列としてフォーマットする必要があります。UIImage
を処理するには:迅速
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
2.呼び出し可能関数を呼び出して、画像にラベルを付けます
画像内のオブジェクトにラベルを付けるには、JSONCloudVisionリクエストを渡して呼び出し可能な関数を呼び出します。まず、CloudFunctionsのインスタンスを初期化します。
迅速
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
タイプを
LABEL_DETECTION
に設定してリクエストを作成します。迅速
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LABEL_DETECTION"] ]
Objective-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LABEL_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 }
Objective-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.ラベル付けされたオブジェクトに関する情報を取得します
画像のラベル付け操作が成功すると、 BatchAnnotateImagesResponseのJSON応答がタスクの結果に返されます。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"]
}
}
Objective-C
NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
NSString *text = labelObj[@"description"];
NSString *entityId = labelObj[@"mid"];
NSNumber *confidence = labelObj[@"score"];
}