Migracja na iOS

Wymagania wstępne

Zanim zaczniesz migrować kod, upewnij się, że spełniasz te wymagania:

  • ML Kit obsługuje Xcode w wersji 13.2.1 lub nowszej.
  • ML Kit obsługuje system iOS w wersji 15.5 lub nowszej.
  • ML Kit nie obsługuje architektur 32-bitowych (i386 i armv7). ML Kit obsługuje architektury 64-bitowe (x86_64 i arm64).
  • Biblioteka ML Kit jest dostępna tylko w formie pakietu cocoapods. Nie możesz łączyć frameworków i cocoapods, więc aby używać tej biblioteki, musisz najpierw przejść na korzystanie z cocoapods.

Aktualizowanie Cocoapods

Zaktualizuj zależności pakietu ML Kit na iOS w pliku Podfile aplikacji:

Interfejs APIStare nazwy podNazwa(-i) nowego pod
Skanowanie kodów kreskowych Firebase/MLVision
Firebase/MLVisionBarcodeModel
GoogleMLKit/BarcodeScanning
Wykrywanie twarzy Firebase/MLVision
Firebase/MLVisionFaceModel
GoogleMLKit/FaceDetection
Dodawanie etykiet do obrazów Firebase/MLVision
Firebase/MLVisionLabelModel
GoogleMLKit/ImageLabeling
Wykrywanie i śledzenie obiektów Firebase/MLVisionObjectDetection GoogleMLKit/wykrywanie obiektów
Rozpoznawanie tekstu Firebase/MLVision
Firebase/MLVisionTextModel
GoogleMLKit/TextRecognition
Etykietowanie obrazów AutoML (model w pakiecie) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
Etykietowanie obrazów za pomocą AutoML (pobieranie modelu z Firebase) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
GoogleMLKit/LinkFirebase
Identyfikator języka Firebase/MLNaturalLanguage
Firebase/MLNLLanguageID
GoogleMLKit/LanguageID
Inteligentna odpowiedź Firebase/MLNaturalLanguage
Firebase/MLNLSmartReply
GoogleMLKit/SmartReply
Tłumacz Firebase/MLNaturalLanguage
Firebase/MLNLTranslate
GoogleMLKit/Translate

Zaktualizuj nazwy klas, typów i enumeracji.

Ogólnie klasy, typy i typy zbiorów muszą zostać przemianowane w ten sposób:

  • Swift: usuń prefiks Vision z nazwy klas i enumów.
  • Objective-C: zastąp prefiksy nazwy klasy i enumeracji FIRVisionFIR prefiksem MLK

Ta ogólna reguła nie dotyczy niektórych nazw i typów klas:

Stara klasa lub typNowa klasa lub typ
AutoMLLocalModel LocalModel
AutoMLRemoteModel CustomRemoteModel
VisionBarcodeDetectionCallback BarcodeScanningCallback
VisionBarcodeDetector BarcodeScanner
VisionBarcodeDetectorOptions BarcodeScannerOptions
VisionImage VisionImage (bez zmian)
VisionPoint VisionPoint (bez zmian)
VisionOnDeviceAutoMLImageLabelerOptions CustomImageLabelerOptions
VisionOnDeviceImageLabelerOptions ImageLabelerOptions
Stara klasa lub typNowa klasa lub typ
FIRAutoMLLocalModel MLKLocalModel
FIRAutoMLRemoteModel MLKCustomRemoteModel
FIRVisionBarcodeDetectionCallback MLKBarcodeScanningCallback
FIRVisionBarcodeDetector MLKBarcodeScanner
FIRVisionBarcodeDetectorOptions MLKBarcodeScannerOptions
FIRVisionImage MLKVisionImage
FIRVisionOnDeviceAutoMLImageLabelerOptions MLKCustomImageLabelerOptions
FIRVisionOnDeviceImageLabelerOptions MLKImageLabelerOptions
FIRVisionPoint MLKVisionPoint

Zmiana nazw metod

Zaktualizuj nazwy metod zgodnie z tymi regułami:

  • Klasy punktów wejścia domeny (Vision, NaturalLanguage) nie istnieją. Zostały one zastąpione klasami przeznaczonymi do konkretnych zadań. Zastąp wywołania różnych metod fabrycznych służących do uzyskiwania detektorów bezpośrednimi wywołaniami metody fabrycznej każdego detektora.

  • Klasa VisionImageMetadata została usunięta wraz z enumeracją VisionDetectorImageOrientation. Aby określić orientację wyświetlania obrazu, użyj właściwości orientation elementu VisionImage.

  • Metoda onDeviceTextRecognizer, która pobiera nową instancję TextRecognizer, została przemianowana na textRecognizer.

  • Właściwość zaufanie została usunięta z klas wyników rozpoznawania tekstu, w tym z funkcji TextElement, TextLineTextBlock.

  • Metody onDeviceImageLabeleronDeviceImageLabeler(options:) służące do uzyskiwania nowej instancji ImageLabeler zostały połączone i nazwane imageLabeler(options:).

  • Metoda objectDetector służąca do uzyskiwania nowej instancji ObjectDetector została usunięta. Zamiast tego użyj kolumny objectDetector(options:).

  • Właściwość type została usunięta z ImageLabeler, a właściwość entityID – z klasy wyników etykietowania obrazu ImageLabel.

  • Interfejs API detect(in _:, completion:) do skanowania kodów kreskowych został przemianowany na process(_:, completion:), aby zachować spójność z innymi interfejsami API do obsługi widzenia komputerowego.

  • Interfejsy Natural Language API używają teraz terminu „tag języka” (zdefiniowanego przez standard BCP-47) zamiast „kodu języka”.

  • TranslateLanguage używa teraz czytelnych nazw (np. .english) zamiast tagów języka ( np. .pl).

Oto kilka przykładów starych i nowych metod Swift:

StaryNowe
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()
    
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())
    

Oto kilka przykładów starych i nowych metod Objective-C:

StaryNowe
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];
    
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];
    

Zmiany dotyczące interfejsu API

Wykrywanie i śledzenie obiektów

Jeśli Twoja aplikacja korzysta z klasyfikacji obiektów, pamiętaj, że nowy pakiet SDK zmienił sposób zwracania kategorii klasyfikacji wykrytych obiektów.

Wartość VisionObjectCategory w elementach VisionObject jest zwracana jako text w obiekcie ObjectLabel, a nie jako liczba całkowita. Wszystkie możliwe kategorie ciągów znaków są uwzględnione w enumeracji DetectedObjectLabel.

Pamiętaj, że kategoria .unknown została usunięta. Jeśli ufność klasyfikacji obiektu jest niska, klasyfikator nie zwraca żadnej etykiety.

Oto przykład starego i nowego kodu Swift:

StaryNowe
if (object.classificationCategory == .food) {
    ...
}
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) {
    ...
  }
}

Oto przykład starego i nowego kodu Objective-C:

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

Usuwanie zależności Firebase (opcjonalnie)

Ten krok dotyczy tylko tych przypadków:

  • Firebase ML Kit jest jedynym używanym przez Ciebie komponentem Firebase.
  • Używasz tylko interfejsów API na urządzeniu.
  • nie używasz obsługi modeli.

W takim przypadku po migracji możesz usunąć zależności od Firebase. Aby to zrobić:

  • Usuń plik konfiguracji Firebase, usuwając plik GoogleService-Info.plist z katalogu aplikacji i projektu Xcode.
  • Usuń z pliku Podfile wszystkie moduły Firebase Cocoapod, np. pod 'Firebase/Analytics'.
  • Usuń z kodu inicjowanie FirebaseApp, np. FirebaseApp.configure().
  • Usuń aplikację Firebase w konsoli Firebase zgodnie z instrukcjami na stronie pomocy Firebase.

Uzyskiwanie pomocy

Jeśli napotkasz jakiekolwiek problemy, odwiedź naszą stronę społeczności, na której znajdziesz informacje o dostępnych kanałach kontaktu z nami.