前提条件
在开始迁移代码之前,请务必满足以下要求:
- ML Kit 支持 Xcode 13.2.1 或更高版本。
- ML Kit 支持 iOS 15.5 版或更高版本。
- ML Kit 不支持 32 位架构(i386 和 armv7)。机器学习套件确实支持 64 位架构(x86_64 和 arm64)。
- 机器学习套件库仅以 cocoapods 的形式提供。您无法混用框架和 CocoaPods,因此若要使用此库,您需要先迁移到使用 CocoaPods。
更新 CocoaPods
更新应用 Podfile 中适用于 ML Kit 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 图片标记(捆绑模型) | Firebase/MLVisionAutoML | GoogleMLKit/ImageLabelingCustom | 
| AutoML 图片标记(从 Firebase 下载模型) | Firebase/MLVisionAutoML | GoogleMLKit/ImageLabelingCustom GoogleMLKit/LinkFirebase | 
| 语言 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 | CustomRemoteModel | 
| VisionBarcodeDetectionCallback | BarcodeScanningCallback | 
| VisionBarcodeDetector | BarcodeScanner | 
| VisionBarcodeDetectorOptions | BarcodeScannerOptions | 
| VisionImage | VisionImage(无变化) | 
| VisionPoint | VisionPoint(无变化) | 
| VisionOnDeviceAutoMLImageLabelerOptions | CustomImageLabelerOptions | 
| VisionOnDeviceImageLabelerOptions | ImageLabelerOptions | 
Objective-C
| 旧类或类型 | 新类或类型 | 
|---|---|
| FIRAutoMLLocalModel | MLKLocalModel | 
| FIRAutoMLRemoteModel | MLKCustomRemoteModel | 
| FIRVisionBarcodeDetectionCallback | MLKBarcodeScanningCallback | 
| FIRVisionBarcodeDetector | MLKBarcodeScanner | 
| FIRVisionBarcodeDetectorOptions | MLKBarcodeScannerOptions | 
| FIRVisionImage | MLKVisionImage | 
| FIRVisionOnDeviceAutoMLImageLabelerOptions | MLKCustomImageLabelerOptions | 
| FIRVisionOnDeviceImageLabelerOptions | MLKImageLabelerOptions | 
| FIRVisionPoint | MLKVisionPoint | 
Objective-C
更新方法名称
根据以下规则更新方法名称:
- 网域入口点类( - Vision、- NaturalLanguage)已不再存在。它们已被特定于任务的类取代。 将对各种用于获取检测器的工厂方法的调用替换为对每个检测器的工厂方法的直接调用。
- 已移除 - VisionImageMetadata类以及- VisionDetectorImageOrientation枚举。使用- VisionImage的- orientation属性指定图片的显示方向。
- 用于获取新 - TextRecognizer实例的- onDeviceTextRecognizer方法已重命名为- textRecognizer。
- 已从文本识别结果类(包括 - TextElement、- TextLine和- TextBlock)中移除置信度属性。
- 用于获取新的 - ImageLabeler实例的- onDeviceImageLabeler和- onDeviceImageLabeler(options:)方法已合并并重命名为- imageLabeler(options:)。
- 移除了用于获取新 - ObjectDetector实例的- objectDetector方法。请改用- objectDetector(options:)。
- 已从 - ImageLabeler中移除了- type属性,并已从图片标签结果类- ImageLabel中移除了- entityID属性。
- 条形码扫描 API - detect(in _:, completion:)已重命名为- process(_:, completion:),以便与其他视觉 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 组件只有 Firebase ML Kit
- 您仅使用设备端 API
- 您不使用模型服务
如果是这种情况,您可以在迁移后移除 Firebase 依赖项。请按照以下步骤操作:
- 通过从应用的目录和 Xcode 项目中删除 GoogleService-Info.plist 文件来移除 Firebase 配置文件。
- 从 Podfile 中移除所有 Firebase cocoapod,例如 pod 'Firebase/Analytics'。
- 从代码中移除所有 FirebaseApp 初始化,例如 FirebaseApp.configure()。
- 按照 Firebase 支持网站上的说明,在 Firebase 控制台中删除您的 Firebase 应用。
获取帮助
如果您遇到任何问题,请访问我们的社区页面,其中列出了可用于与我们联系的渠道。
