Per chiamare un'API Google Cloud dalla tua app, devi creare una API REST che gestisce l'autorizzazione e protegge i valori dei secret come le chiavi API. Devi quindi scrivi il codice nella tua app mobile per autenticarti e comunicare con questo servizio intermedio.
Un modo per creare questa API REST è utilizzare Firebase Authentication and Functions, che offre un gateway serverless gestito per API Google Cloud che gestiscono l'autenticazione e possono essere chiamate dalla tua app mobile con con SDK predefiniti.
Questa guida mostra come utilizzare questa tecnica per chiamare l'API Cloud Vision dalla tua app. Questo metodo consentirà a tutti gli utenti autenticati di accedere ai servizi Cloud Vision fatturati tramite il tuo progetto Cloud, quindi valuta se questo meccanismo di autenticazione è sufficiente per il tuo caso d'uso prima di procedere.
Prima di iniziare
Configura il progetto
Se non hai già aggiunto Firebase alla tua app, puoi farlo seguendo le istruzioni riportate in passaggi nella Guida introduttiva.Usa Swift Package Manager per installare e gestire le dipendenze di Firebase.
- In Xcode, con il progetto dell'app aperto, vai a File > Aggiungi pacchetti.
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple Firebase:
- Scegli la libreria Firebase ML.
- Aggiungi il flag
-ObjC
alla sezione Altri flag linker delle impostazioni di build del target. - Al termine, Xcode inizierà automaticamente a risolvere e scaricare il le dipendenze in background.
https://github.com/firebase/firebase-ios-sdk.git
A questo punto, esegui la configurazione in-app:
- Nell'app, importa Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
Ancora qualche passaggio di configurazione e siamo pronti a partire:
-
Se non hai già abilitato le API basate su cloud per il tuo progetto, procedi nel seguente modo: ora:
- Apri l'app Firebase ML API della console Firebase.
-
Se non hai già eseguito l'upgrade del progetto al piano tariffario Blaze, fai clic su Per farlo, esegui l'upgrade. Ti verrà chiesto di eseguire l'upgrade solo se non è incluso nel piano Blaze.)
Solo i progetti a livello di Blaze possono utilizzare le API basate su cloud.
- Se le API basate su cloud non sono già abilitate, fai clic su Abilita basate su cloud per le API.
- Configura le chiavi API Firebase esistenti per non consentire l'accesso a Cloud
API Vision:
- Apri la pagina Credenziali della console Cloud.
- Per ogni chiave API nell'elenco, apri la visualizzazione di modifica e, nella sezione Restrizioni chiave, aggiungi all'elenco tutte le API disponibili tranne l'API Cloud Vision.
Esegui il deployment della funzione richiamabile
Quindi, esegui il deployment della funzione Cloud Functions che utilizzerai per collegare la tua app
API Vision. Il repository functions-samples
contiene un esempio
che puoi utilizzare.
Per impostazione predefinita, l'accesso all'API Cloud Vision tramite questa funzione consentirà solo gli utenti autenticati della tua app accedono all'API Cloud Vision. Puoi modificare la funzione in base a requisiti diversi.
Per eseguire il deployment della funzione:
- Clonare o scaricare il reposito di Functions-samples
e passa alla directory
Node-1st-gen/vision-annotate-image
:git clone https://github.com/firebase/functions-samples
cd Node-1st-gen/vision-annotate-image
- Installa le dipendenze:
cd functions
npm install
cd ..
- Se non hai l'interfaccia a riga di comando di Firebase, installala.
- Inizializza un progetto Firebase in
vision-annotate-image
. Quando richiesto, seleziona il progetto dall'elenco.firebase init
- Esegui il deployment della funzione:
firebase deploy --only functions:annotateImage
Aggiungi Firebase Auth alla tua app
La funzione richiamabile di cui è stato eseguito il deployment sopra respingerà qualsiasi richiesta proveniente da indirizzi gli utenti della tua app. Se non lo hai già fatto, dovrai aggiungere Firebase Autenticazione nell'app.
Aggiungi le dipendenze necessarie alla tua app
Utilizza Swift Package Manager per installare la libreria Cloud Functions for Firebase.
1. Prepara l'immagine di input
Per chiamare Cloud Vision, l'immagine deve essere formattata con codifica Base64 stringa. Per elaborare 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. Richiamare la funzione richiamabile per riconoscere i punti di riferimento
Per riconoscere i punti di riferimento in un'immagine, richiama la funzione richiamabile passando un Richiesta JSON Cloud Vision.Inizializza un'istanza di Cloud Functions:
Swift
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
Crea una richiesta impostando il Tipo su
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"} };
Infine, richiama la funzione:
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. Ricevere informazioni sui punti di riferimento riconosciuti
Se l'operazione di riconoscimento dei punti di riferimento ha esito positivo, una risposta JSON di
BatchAnnotateImagesResponse
verrà restituito nel risultato dell'attività. Ogni oggetto in landmarkAnnotations
rappresenta un punto di riferimento riconosciuto nell'immagine. Per ogni punto di riferimento,
puoi ottenere le coordinate di delimitazione nell'immagine di input, il nome del punto di riferimento
la latitudine e la longitudine, l'ID entità del Knowledge Graph (se disponibile) e
il punteggio di confidenza della corrispondenza. Ad esempio:
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"];
}
}