Etichetta le immagini in sicurezza con Cloud Vision utilizzando Firebase Auth e Functions sulle piattaforme Apple

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 e Functions, che ti offre un gateway serverless gestito per le API Google Cloud che gestisce l'autenticazione e può essere chiamato dalla tua app mobile 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 fatturati Cloud Vision tramite il tuo progetto Cloud, quindi valuta se questo meccanismo di autenticazione è sufficiente per il tuo caso d'uso prima di procedere.

di Gemini Advanced.

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.

  1. In Xcode, con il progetto dell'app aperto, vai a File > Aggiungi pacchetti.
  2. Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Scegli la libreria Firebase ML.
  5. Aggiungi il flag -ObjC alla sezione Altri flag linker delle impostazioni di build del target.
  6. Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.

Poi, esegui la configurazione in-app:

  1. Nell'app, importa Firebase:

    Swift

    import FirebaseMLModelDownloader

    Objective-C

    @import FirebaseMLModelDownloader;

Mancano solo alcuni passaggi di configurazione:

  1. Se non hai già abilitato le API basate su cloud per il tuo progetto, procedi nel seguente modo: ora:

    1. Apri l'app Firebase ML API della console Firebase.
    2. 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.

    3. Se le API basate su cloud non sono già abilitate, fai clic su Abilita basate su cloud per le API.
    di Gemini Advanced.
  2. Configura le chiavi API Firebase esistenti per non consentire l'accesso all'API Cloud Vision:
    1. Apri la pagina Credenziali della console Cloud.
    2. Per ogni chiave API nell'elenco, apri la visualizzazione di modifica e nella finestra Restrizioni, aggiungi tutte le API disponibili tranne Cloud Vision API nell'elenco.

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:

  1. Clona o scarica il repository 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
    
  2. Installa le dipendenze:
    cd functions
    npm install
    cd ..
  3. Se non hai l'interfaccia a riga di comando di Firebase, installala.
  4. Inizializza un progetto Firebase in vision-annotate-image . Quando richiesto, seleziona il progetto dall'elenco.
    firebase init
  5. Esegui il deployment della funzione:
    firebase deploy --only functions:annotateImage

Aggiungere Firebase Auth all'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.

Ora puoi etichettare le immagini.

1. Prepara l'immagine di input

Per chiamare Cloud Vision, l'immagine deve essere formattata con codifica Base64 stringa. Per elaborare un 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. Richiama la funzione chiamabile per etichettare l'immagine

Per etichettare gli oggetti in un'immagine, richiama la funzione richiamabile passando un Richiesta JSON Cloud Vision.

  1. Inizializza un'istanza di Cloud Functions:

    Swift

    lazy var functions = Functions.functions()
    

    Objective-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. Crea una richiesta impostando il Tipo su 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"}
    };
    
  3. 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. Ottieni informazioni sugli oggetti etichettati

Se l'operazione di etichettatura delle immagini va a buon fine, nel risultato dell'attività verrà restituita una risposta JSON di BatchAnnotateImagesResponse. Ogni oggetto in labelAnnotations rappresenta qualcosa che è stato etichettato nell'immagine. Per ogni etichetta, può recuperare la descrizione testuale, le sue ID entità Knowledge Graph (se disponibile) e il punteggio di confidenza della corrispondenza. Ad esempio:

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"];
}