Migrazione per iOS

Questa guida spiega come eseguire la migrazione da ML Kit for Firebase per iOS.

Prerequisiti

Prima di iniziare la migrazione del codice, assicurati di soddisfare i seguenti requisiti:

  • ML Kit supporta Xcode 13.2.1 o versioni successive.
  • ML Kit supporta iOS versione 15.5 o versioni successive.
  • ML Kit non supporta le architetture a 32 bit (i386 e armv7). ML Kit supporta le architetture a 64 bit (x86_64 e arm64).
  • La libreria ML Kit viene fornita solo come cocoapods. Non puoi combinare framework e cocoapods, quindi per utilizzare questa libreria devi prima eseguire la migrazione per utilizzare cocoapods.

Aggiorna Cocoapods

Aggiorna le dipendenze per i cocoapods ML Kit iOS nel Podfile della tua app:

APINomi dei pod precedentiNomi dei nuovi pod
Scansione del codice a barre Firebase/MLVision
Firebase/MLVisionBarcodeModel
GoogleMLKit/BarcodeScanning
Riconoscimento facciale Firebase/MLVision
Firebase/MLVisionFaceModel
GoogleMLKit/FaceDetection
Etichettatura delle immagini Firebase/MLVision
Firebase/MLVisionLabelModel
GoogleMLKit/ImageLabeling
Rilevamento di oggetti e monitoraggio Firebase/MLVisionObjectDetection GoogleMLKit/ObjectDetection
Riconoscimento del testo Firebase/MLVision
Firebase/MLVisionTextModel
GoogleMLKit/TextRecognition
Etichettatura delle immagini AutoML (modello in bundle) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
Etichettatura delle immagini AutoML (modello scaricato) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom

Per ospitare e scaricare modelli personalizzati, sposta i modelli in Cloud Storage e aggiungi la logica di download nella tua app per caricarli come modelli locali. Per maggiori dettagli, consulta la guida alla migrazione da Firebase ML a Cloud Storage.
ID lingua Firebase/MLNaturalLanguage
Firebase/MLNLLanguageID
GoogleMLKit/LanguageID
Risposta rapida Firebase/MLNaturalLanguage
Firebase/MLNLSmartReply
GoogleMLKit/SmartReply
Traduci Firebase/MLNaturalLanguage
Firebase/MLNLTranslate
GoogleMLKit/Translate

Aggiorna i nomi di classi, enum e tipi

In generale, le classi, gli enum e i tipi devono essere rinominati come segue:

  • Swift: rimuovi il prefisso Vision dai nomi delle classi e dagli enum
  • Objective-C: sostituisci i prefissi dei nomi delle classi e degli enum FIRVision e FIR con MLK

Per alcuni nomi di classi e tipi, questa regola generale non si applica:

Swift

Classe o tipo precedenteNuova classe o tipo
AutoMLLocalModel LocalModel
AutoMLRemoteModel LocalModel

Richiede il download manuale. I modelli remoti ospitati da Firebase sono stati ritirati. Per maggiori dettagli, consulta la guida alla migrazione da Firebase ML a Cloud Storage.
VisionBarcodeDetectionCallback BarcodeScanningCallback
VisionBarcodeDetector BarcodeScanner
VisionBarcodeDetectorOptions BarcodeScannerOptions
VisionImage VisionImage (nessuna modifica)
VisionPoint VisionPoint (nessuna modifica)
VisionOnDeviceAutoMLImageLabelerOptions CustomImageLabelerOptions
VisionOnDeviceImageLabelerOptions ImageLabelerOptions

Objective-C

Classe o tipo precedenteNuova classe o tipo
FIRAutoMLLocalModel MLKLocalModel
FIRAutoMLRemoteModel MLKLocalModel

Richiede il download manuale. I modelli remoti ospitati da Firebase sono stati ritirati. Per maggiori dettagli, consulta la guida alla migrazione da Firebase ML a Cloud Storage.
FIRVisionBarcodeDetectionCallback MLKBarcodeScanningCallback
FIRVisionBarcodeDetector MLKBarcodeScanner
FIRVisionBarcodeDetectorOptions MLKBarcodeScannerOptions
FIRVisionImage MLKVisionImage
FIRVisionPoint MLKVisionPoint
FIRVisionOnDeviceAutoMLImageLabelerOptions MLKCustomImageLabelerOptions
FIRVisionOnDeviceImageLabelerOptions MLKImageLabelerOptions

Aggiorna i nomi dei metodi

Aggiorna i nomi dei metodi in base a queste regole:

  • Le classi dei punti di ingresso del dominio (Vision, NaturalLanguage) non esistono più. Sono state sostituite da classi specifiche per le attività. Sostituisci le chiamate ai vari metodi factory per ottenere i rilevatori con chiamate dirette al metodo factory di ogni rilevatore.

  • La classe VisionImageMetadata è stata rimossa, insieme all'enum VisionDetectorImageOrientation. Utilizza la proprietà orientation di VisionImage per specificare l'orientamento di visualizzazione di un'immagine.

  • Il metodo onDeviceTextRecognizer che ottiene una nuova istanza TextRecognizer è stato rinominato in textRecognizer.

  • La proprietà di confidenza è stata rimossa dalle classi dei risultati del riconoscimento del testo, tra cui TextElement, TextLine e TextBlock.

  • I metodi onDeviceImageLabeler e onDeviceImageLabeler(options:) per ottenere una nuova istanza ImageLabeler sono stati uniti e rinominati in imageLabeler(options:).

  • Il metodo objectDetector per ottenere una nuova istanza ObjectDetector è stato rimosso. Utilizza invece objectDetector(options:).

  • La proprietà type è stata rimossa da ImageLabeler e la entityID proprietà è stata rimossa dalla classe dei risultati dell'etichettatura delle immagini, ImageLabel.

  • L'API di scansione del codice a barre detect(in _:, completion:) è stata rinominata in process(_:, completion:) per coerenza con altre API Vision.

  • Le API Natural Language ora utilizzano il termine "tag lingua" (come definito dallo standard BCP-47) anziché "codice lingua".

  • TranslateLanguage ora utilizza nomi leggibili (ad es. .english) per le costanti anziché tag lingua (ad es. .en).

Ecco alcuni esempi di metodi Swift precedenti e nuovi:

Precedente

let options = VisionOnDeviceImageLabelerOptions()
options.confidenceThreshold = 0.75
let labeler = Vision.vision().onDeviceImageLabeler(options: options)

let detector = Vision.vision().faceDetector(options: options)

let localModel = AutoMLLocalModel(manifestPath: "automl/manifest.json")
let options = VisionOnDeviceAutoMLImageLabelerOptions(localModel: localModel)
options.confidenceThreshold = 0.75
let labeler = vision.onDeviceAutoMLImageLabeler(options: options)

let detector = Vision.vision().objectDetector()
    

Nuovo

let options = ImageLabelerOptions()
options.confidenceThreshold = NSNumber(value:0.75)
let labeler = ImageLabeler.imageLabeler(options: options)

let detector = FaceDetector.faceDetector(options: options)

let localModel = LocalModel(manifestPath: "automl/manifest.json")
let options = CustomImageLabelerOptions(localModel: localModel)
options.confidenceThreshold = NSNumber(value:0.75)
let labeler = ImageLabeler.imageLabeler(options: options)

let detector = ObjectDetector.objectDetector(options: ObjectDetectorOptions())
    

Ecco alcuni esempi di metodi Objective-C precedenti e nuovi:

Precedente

FIRVisionOnDeviceImageLabelerOptions *options =
    [[FIRVisionOnDeviceImageLabelerOptions alloc] init];
options.confidenceThreshold = 0.75;
FIRVisionImageLabeler *labeler =
    [[FIRVision vision] onDeviceImageLabelerWithOptions:options];

FIRVisionFaceDetector *detector =
    [[FIRVision vision] faceDetectorWithOptions: options];

FIRAutoMLLocalModel *localModel =
    [[FIRAutoMLLocalModel alloc] initWithManifestPath:@"automl/manifest.json"];
FIRVisionOnDeviceAutoMLImageLabelerOptions *options =
    [[FIRVisionOnDeviceAutoMLImageLabelerOptions alloc]
        initWithLocalModel: localModel];
options.confidenceThreshold = 0.75
FIRVisionImageLabeler *labeler =
    [[FIRVision vision] onDeviceAutoMLImageLabelerWithOptions:options];

FIRVisionObjectDetector *detector =
    [[FIRVision vision] objectDetector];
    

Nuovo

MLKImageLabelerOptions *options =
    [[MLKImageLabelerOptions alloc] init];
options.confidenceThreshold = @(0.75);
MLKImageLabeler *labeler =
    [MLKImageLabeler imageLabelerWithOptions:options];

MLKFaceDetector *detector =
    [MLKFaceDetector faceDetectorWithOptions:options];

MLKLocalModel *localModel =
    [[MLKLocalModel alloc]
        initWithManifestPath:@"automl/manifest.json"];
MLKCustomImageLabelerOptions *options =
    [[MLKCustomImageLabelerOptions alloc] initWithLocalModel:localModel];
options.confidenceThreshold = @(0.75)
MLKImageLabeler *labeler =
    [MLKImageLabeler imageLabelerWithOptions:options];

MLKObjectDetectorOptions *options = [[MLKObjectDetectorOptions alloc] init];
MLKObjectDetector *detector = [MLKObjectDetector objectDetectorWithOptions:options];
    

Modifiche specifiche dell'API

Rilevamento di oggetti e monitoraggio

Se la tua app utilizza la classificazione degli oggetti, tieni presente che il nuovo SDK ha modificato il modo in cui restituisce la categoria di classificazione per gli oggetti rilevati.

VisionObjectCategory in VisionObject viene restituito come text in un oggetto ObjectLabel, anziché come un numero intero. Tutte le possibili categorie di stringhe sono incluse nell'enum DetectedObjectLabel.

Tieni presente che la categoria .unknown è stata rimossa. Quando la confidenza della classificazione di un oggetto è bassa, il classificatore non restituisce alcuna etichetta.

Ecco un esempio del codice Swift precedente e nuovo:

Precedente

if (object.classificationCategory == .food) {
    ...
}

Nuovo

if let label = object.labels.first {
  if (label.text == DetectedObjectLabel.food.rawValue) {
    ...
  }
}
// or
if let label = object.labels.first {
  if (label.index == DetectedObjectLabelIndex.food.rawValue) {
    ...
  }
}

Ecco un esempio del codice Objective-C precedente e nuovo:

Precedente

if (object.classificationCategory == FIRVisionObjectCategoryFood) {
    ...
}

Nuovo

if ([object.labels[0].text isEqualToString:MLKDetectedObjectLabelFood]) {
  ...
}
// or
if ([object.labels[0].index == MLKDetectedObjectLabelIndexFood]) {
  ...
}

Rimuovi le dipendenze di Firebase

Rimuovi le dipendenze di Firebase dopo la migrazione. Procedi nel seguente modo:

  • Rimuovi il file di configurazione di Firebase eliminando il file GoogleService-Info.plist dalla directory dell'app e dal progetto Xcode.
  • Rimuovi eventuali cocoapod di Firebase, ad esempio pod 'Firebase/Analytics', dal tuo Podfile.
  • Rimuovi qualsiasi inizializzazione di FirebaseApp, ad esempio FirebaseApp.configure() dal codice.
  • Elimina l'app Firebase nella Console Firebase seguendo le istruzioni riportate sul sito di assistenza di Firebase.

Risorse di assistenza

In caso di problemi, consulta la nostra pagina della community in cui sono descritti i canali disponibili per contattarci.