针对 iOS 进行迁移

本指南介绍了如何从 iOS 版 Firebase 机器学习套件迁移。

前提条件

在开始迁移代码之前,请确保您满足以下要求:

  • 机器学习套件支持 Xcode 13.2.1 或更高版本。
  • 机器学习套件支持 iOS 15.5 或更高版本。
  • 机器学习套件不支持 32 位架构(i386 和 armv7)。机器学习套件确实支持 64 位架构(x86_64 和 arm64)。
  • 机器学习套件库仅以 cocoapods 形式提供。您不能混用框架和 cocoapods,因此,如需使用此库,您需要先迁移到使用 cocoapods。

更新 Cocoapods

在应用的 Podfile 中更新 iOS 版机器学习套件 CocoaPod 的依赖项:

API旧 Pod 名称新 Pod 名称
条形码扫描 Firebase/MLVision
Firebase/MLVisionBarcodeModel
GoogleMLKit/BarcodeScanning
人脸检测 Firebase/MLVision
Firebase/MLVisionFaceModel
GoogleMLKit/FaceDetection
图片标注 Firebase/MLVision
Firebase/MLVisionLabelModel
GoogleMLKit/ImageLabeling
对象检测和跟踪 Firebase/MLVisionObjectDetection GoogleMLKit/ObjectDetection
文本识别 Firebase/MLVision
Firebase/MLVisionTextModel
GoogleMLKit/TextRecognition
AutoML Image 标签(捆绑模型) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
AutoML Image 图片标签(已下载模型) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom

如需托管和下载自定义模型,请将模型移至 Cloud Storage,并在应用中添加下载逻辑,以便将其作为本地模型加载。如需了解详情,请参阅 Firebase ML 到 Cloud Storage 迁移指南。
语言 ID Firebase/MLNaturalLanguage
Firebase/MLNLLanguageID
GoogleMLKit/LanguageID
智能回复 Firebase/MLNaturalLanguage
Firebase/MLNLSmartReply
GoogleMLKit/SmartReply
翻译 Firebase/MLNaturalLanguage
Firebase/MLNLTranslate
GoogleMLKit/Translate

更新类、枚举和类型的名称

通常,类、枚举和类型需要重命名,如下所示:

  • Swift:从类名称和枚举中移除 Vision 前缀
  • Objective-C:将 FIRVision 和 FIR 类名称和枚举前缀替换为 MLK

对于某些类名称和类型,此一般规则不适用:

Swift

旧类或类型新建类或类型
AutoMLLocalModel LocalModel
AutoMLRemoteModel LocalModel

需要手动下载。Firebase 托管的远程模型已弃用。如需了解详情,请参阅 Firebase ML 到 Cloud Storage 迁移指南。
VisionBarcodeDetectionCallback BarcodeScanningCallback
VisionBarcodeDetector BarcodeScanner
VisionBarcodeDetectorOptions BarcodeScannerOptions
VisionImage VisionImage(无变化)
VisionPoint VisionPoint(不更改)
VisionOnDeviceAutoMLImageLabelerOptions CustomImageLabelerOptions
VisionOnDeviceImageLabelerOptions ImageLabelerOptions

Objective-C

旧类或类型新建类或类型
FIRAutoMLLocalModel MLKLocalModel
FIRAutoMLRemoteModel MLKLocalModel

需要手动下载。Firebase 托管的远程模型已弃用。如需了解详情,请参阅 Firebase ML 到 Cloud Storage 迁移指南。
FIRVisionBarcodeDetectionCallback MLKBarcodeScanningCallback
FIRVisionBarcodeDetector MLKBarcodeScanner
FIRVisionBarcodeDetectorOptions MLKBarcodeScannerOptions
FIRVisionImage MLKVisionImage
FIRVisionPoint MLKVisionPoint
FIRVisionOnDeviceAutoMLImageLabelerOptions MLKCustomImageLabelerOptions
FIRVisionOnDeviceImageLabelerOptions MLKImageLabelerOptions

更新方法名称

根据以下规则更新方法名称:

  • 网域入口点类(Vision、NaturalLanguage)不再存在。 它们已被特定于任务的类所取代。将对用于获取检测器的各种工厂方法的调用替换为对每个检测器的工厂方法的直接调用。

  • 已移除 VisionImageMetadata 类以及 VisionDetectorImageOrientation 枚举。使用 VisionImage 的 orientation 属性指定图片的显示方向。

  • 用于获取新 TextRecognizer 实例的 onDeviceTextRecognizer 方法已重命名为 textRecognizer。

  • 置信度属性已从文字识别结果类(包括 TextElement、TextLine 和 TextBlock)中移除。

  • 用于获取新 ImageLabeler 实例的 onDeviceImageLabeler 和 onDeviceImageLabeler(options:) 方法已合并并重命名为 imageLabeler(options:)。

  • 用于获取新 ObjectDetector 实例的 objectDetector 方法已被移除。请改用 objectDetector(options:)。

  • type 属性已从 ImageLabeler 中移除,entityID 属性已从图片标签结果类 ImageLabel 中移除。

  • 条形码扫描 API detect(in _:, completion:) 已重命名为 process(_:, completion:),以便与其他 Vision API 保持一致。

  • Natural Language API 现在使用术语“语言标记”(由 BCP-47 标准定义),而不是“语言代码”。

  • TranslateLanguage 现在为其常量使用可读名称(如 .english),而不是语言标记(如 .en)。

以下是一些新旧 Swift 方法的示例:

旧优惠

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

以下是一些新旧 Objective-C 方法的示例:

旧优惠

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

API 专属变更

对象检测和跟踪

如果您的应用使用对象分类,请注意,新 SDK 更改了返回检测到的对象的分类类别的方式。

VisionObject 中的 VisionObjectCategory 会作为 ObjectLabel 对象中的 text(而不是整数)返回。所有可能的字符串类别都包含在 DetectedObjectLabel 枚举中。

请注意,.unknown 类别已被移除。如果对对象进行分类的置信度较低,则分类器根本不会返回任何标签。

以下是新旧 Swift 代码的示例:

旧优惠

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) {
    ...
  }
}

以下是新旧 Objective-C 代码的示例:

旧优惠

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

新

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

移除 Firebase 依赖项

迁移后移除 Firebase 依赖项。请按照以下步骤操作:

  • 从应用的目录和 Xcode 项目中删除 GoogleService-Info.plist 文件,以移除 Firebase 配置文件。
  • 从 Podfile 中移除所有 Firebase cocoapod,例如 pod 'Firebase/Analytics'。
  • 从代码中移除所有 FirebaseApp 初始化,例如 FirebaseApp.configure()。
  • 根据 Firebase 支持网站上的说明,在 Firebase 控制台中删除您的 Firebase 应用。

获取帮助

如果您遇到任何问题,请访问我们的社区页面,其中列出了与我们联系的可用渠道。