Pour appeler une API Google Cloud à partir de votre application, vous devez créer une API REST intermédiaire qui gère l'autorisation et protège les valeurs secrètes telles que les clés API. Vous devez ensuite écrire du code dans votre application mobile pour vous authentifier auprès de ce service intermédiaire et communiquer avec lui.
Pour créer cette API REST, vous pouvez utiliser Firebase Authentication et Functions, qui vous fournit une passerelle gérée et sans serveur vers les API Google Cloud qui gère l'authentification et peut être appelée à partir de votre application mobile avec des SDK prédéfinis.
Ce guide explique comment utiliser cette technique pour appeler l'API Cloud Vision à partir de votre application. Cette méthode permet à tous les utilisateurs authentifiés d'accéder aux services facturés Cloud Vision via votre projet Cloud. Réfléchissez donc à ce mécanisme d'authentification avant de continuer.
Avant de commencer
Configurez votre projet
Si vous n'avez pas encore ajouté Firebase à votre application, suivez la procédure décrite dans le guide de démarrage.Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.
- Dans Xcode, à partir de votre projet d'application ouvert, accédez à File > Add Packages (Fichier > Ajouter des packages).
- Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
- Choisissez la bibliothèque Firebase ML.
- Ajoutez l'indicateur
-ObjC
à la section Other Linker Flags (Autres indicateurs Linker) des paramètres de compilation de votre cible. - Lorsque vous avez terminé, Xcode commence à résoudre et à télécharger automatiquement vos dépendances en arrière-plan.
https://github.com/firebase/firebase-ios-sdk.git
Effectuez ensuite une configuration dans l'application:
- Dans votre application, importez Firebase :
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
Suivez quelques étapes de configuration supplémentaires pour être prêt:
-
Si vous n'avez pas encore activé les API basées sur le cloud pour votre projet, faites-le maintenant:
- Ouvrez la page API Firebase ML de la console Firebase.
-
Si vous n'avez pas encore migré votre projet vers le forfait Blaze, cliquez sur Mettre à niveau pour le faire. (Vous ne serez invité à effectuer la migration que si votre projet n'est pas associé au forfait Blaze.)
Seuls les projets de niveau Blaze peuvent utiliser les API basées sur le cloud.
- Si les API cloud ne sont pas déjà activées, cliquez sur Activer les API cloud.
- Configurez vos clés API Firebase existantes pour refuser l'accès à l'API Cloud Vision :
- Ouvrez la page Identifiants de la console Cloud.
- Pour chaque clé API de la liste, ouvrez la vue de modification. Dans la section "Restrictions de clé", ajoutez toutes les API disponibles sauf l'API Cloud Vision à la liste.
Déployer la fonction appelable
Ensuite, déployez la fonction Cloud que vous utiliserez pour établir un pont entre votre application et l'API Cloud Vision. Le dépôt functions-samples
contient un exemple que vous pouvez utiliser.
Par défaut, l'accès à l'API Cloud Vision via cette fonction ne permet qu'aux utilisateurs authentifiés de votre application d'accéder à l'API Cloud Vision. Vous pouvez modifier la fonction pour différentes exigences.
Pour déployer la fonction, procédez comme suit :
- Clonez ou téléchargez le dépôt functions-samples et accédez au répertoire
Node-1st-gen/vision-annotate-image
:git clone https://github.com/firebase/functions-samples
cd Node-1st-gen/vision-annotate-image
- Installez les dépendances :
cd functions
npm install
cd ..
- Si vous ne disposez pas de la CLI Firebase, installez-la.
- Initialisez un projet Firebase dans le répertoire
vision-annotate-image
. Lorsque vous y êtes invité, sélectionnez votre projet dans la liste.firebase init
- Déployez la fonction :
firebase deploy --only functions:annotateImage
Ajouter Firebase Auth à votre application
La fonction appelable déployée ci-dessus refusera toute requête provenant d'utilisateurs non authentifiés de votre application. Si vous ne l'avez pas déjà fait, vous devez ajouter Firebase Auth à votre application.
Ajouter les dépendances nécessaires à votre application
Utilisez Swift Package Manager pour installer la bibliothèque Cloud Functions pour Firebase.
1. Préparer l'image d'entrée
Pour appeler Cloud Vision, l'image doit être mise en forme sous la forme d'une chaîne encodée en base64. Pour traiter unUIImage
:
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. Appeler la fonction appelable pour reconnaître les repères
Pour reconnaître des repères dans une image, appelez la fonction appelable en transmettant une requête Cloud Vision au format JSON.Commencez par initialiser une instance de Cloud Functions:
Swift
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
Créez une requête en définissant Type sur
LANDMARK_DETECTION
:Swift
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"] ]
Objective-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"} };
Enfin, appelez la fonction:
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. Obtenir des informations sur les repères reconnus
Si l'opération de reconnaissance de repère aboutit, une réponse JSON de type BatchAnnotateImagesResponse est renvoyée dans le résultat de la tâche. Chaque objet du tableau landmarkAnnotations
représente un repère reconnu dans l'image. Pour chaque point de repère, vous pouvez obtenir ses coordonnées de délimitation dans l'image d'entrée, son nom, sa latitude et sa longitude, son ID d'entité Knowledge Graph (le cas échéant) et le score de confiance de la correspondance. Exemple :
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"]
}
}
}
Objective-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"];
}
}