OCR en iOS con Apple Vision y Swift
Para una nueva función de OCR en iOS, empieza con el framework Vision de Apple en lugar de un
wrapper de Tesseract. El
RecognizeTextRequest
nativo de Swift reconoce texto en imágenes fijas, mientras que el
DataScannerViewController
de VisionKit ofrece un escáner de cámara en vivo listo para usar, para texto y códigos legibles por
máquina.
Esa recomendación cambia respecto a la versión original de esta guía. El propio repositorio de SwiftyTesseract está archivado y ya no recibe mantenimiento, y su responsable recomienda Apple Vision para los idiomas compatibles.
¿Qué API de OCR para iOS deberías usar?
| Requisito | Ruta recomendada | Por qué |
|---|---|---|
| Reconocer texto en una imagen capturada o seleccionada | RecognizeTextRequest | Tú controlas la captura de la imagen, la configuración de la solicitud y el manejo del resultado. |
| Escanear texto de forma continua con la cámara | DataScannerViewController | VisionKit aporta la interfaz de cámara, las guías, el resaltado y las actualizaciones en vivo. |
| Procesar las subidas después de que salen del dispositivo | Transloadit 🤖/image/ocr | El Step de OCR puede ejecutarse dentro del mismo flujo de trabajo de backend que el almacenamiento y otro procesamiento de medios. |
| Usar un idioma o modelo personalizado no disponible en Vision | Un motor de OCR con mantenimiento activo o tu propia integración de Tesseract | Valida la cobertura de idiomas, el mantenimiento del binario y el empaquetado para la App Store antes de comprometerte. |
Usa Vision en el dispositivo cuando el reconocimiento forme parte de una interacción inmediata en iOS. Usa un flujo de trabajo de OCR en el backend cuando los trabajos deban continuar de forma independiente de la app, procesar muchas subidas o alimentar el resultado hacia el almacenamiento y otros pasos de procesamiento.
Reconocer texto en una imagen fija
El siguiente servicio acepta un CGImage orientado correctamente, ejecuta Apple Vision y devuelve
el mejor candidato de texto de cada observación. .accurate prioriza la precisión del reconocimiento;
usa .fast cuando la latencia importe más. Esta API nativa de Swift requiere iOS 18+ y Xcode 16+.
import CoreGraphics
import Vision
final class TextRecognizer {
func recognizeText(in image: CGImage) async throws -> [String] {
var request = RecognizeTextRequest()
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
let observations = try await request.perform(on: image)
return observations.compactMap { observation in
observation.topCandidates(1).first?.string
}
}
}
Si tu objetivo de despliegue incluye versiones anteriores del sistema operativo, usa la API original
VNRecognizeTextRequest
detrás de la misma interfaz de nivel de aplicación. Mantener la llamada de OCR detrás de un servicio
pequeño hace que esa decisión de compatibilidad sea independiente del resto de la interfaz.
Vision expone controles adicionales para la selección de idioma, el vocabulario personalizado y la altura mínima del texto. Consulta a la solicitud activa cuáles son sus idiomas de reconocimiento compatibles en lugar de codificar a mano una lista de idiomas que puede variar según la versión del sistema operativo y la revisión de la solicitud.
Si la imagen proviene de UIImage, acota la representación opcional de Core Graphics antes de llamar
al servicio. En este ejemplo se asume que los píxeles de la imagen ya se normalizaron a la
orientación vertical correcta; cgImage por sí solo no conserva UIImage.imageOrientation:
enum ImageInputError: Error {
case missingCoreGraphicsImage
}
guard let cgImage = selectedImage.cgImage else {
throw ImageInputError.missingCoreGraphicsImage
}
let lines = try await TextRecognizer().recognizeText(in: cgImage)
let recognizedText = lines.joined(separator: "\n")
Ejecuta el trabajo de reconocimiento fuera del código de interfaz sensible a la latencia y luego actualiza el estado de la interfaz en el actor principal.
Escanear texto desde la cámara en vivo
Para un escáner interactivo, DataScannerViewController puede reconocer texto directamente desde la señal
de la cámara en iOS 16+. Comprueba tanto isSupported como isAvailable: el soporte de hardware por sí solo
no garantiza que el escaneo esté disponible actualmente.
import UIKit
import VisionKit
@MainActor
final class ScannerViewController: UIViewController, DataScannerViewControllerDelegate {
private var scanner: DataScannerViewController?
func presentScanner() {
guard DataScannerViewController.isSupported,
DataScannerViewController.isAvailable
else {
return
}
let scanner = DataScannerViewController(
recognizedDataTypes: [.text()],
qualityLevel: .balanced,
recognizesMultipleItems: true,
isHighFrameRateTrackingEnabled: false,
isPinchToZoomEnabled: true,
isGuidanceEnabled: true,
isHighlightingEnabled: true
)
scanner.delegate = self
self.scanner = scanner
present(scanner, animated: true) {
do {
try scanner.startScanning()
} catch {
scanner.stopScanning()
self.scanner = nil
scanner.dismiss(animated: true) {
let alert = UIAlertController(
title: "Scanner unavailable",
message: "Please select a still image instead.",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "OK", style: .default))
self.present(alert, animated: true)
}
}
}
}
func dataScanner(
_ dataScanner: DataScannerViewController,
didTapOn item: RecognizedItem
) {
guard case let .text(text) = item else {
return
}
print(text.transcript)
}
}
Agrega NSCameraUsageDescription a la lista de propiedades de información de la app con una explicación clara de
por qué se requiere el acceso a la cámara. Ofrece una alternativa con imagen fija cuando el escaneo
en vivo no esté disponible.
Lleva el OCR por lotes a un flujo de trabajo de Transloadit
El OCR en el dispositivo encaja bien para dar retroalimentación inmediata, pero ata el procesamiento a la sesión de la app. Para las subidas que necesitan un procesamiento duradero y controlado desde el backend, agrega 🤖/image/ocr a una Assembly. El Robot es compatible con los proveedores AWS y GCP y puede devolver JSON, texto plano o metadatos para un Step posterior.
Este Template extrae texto UTF-8 de cada imagen subida y almacena tanto la imagen original como el resultado del OCR:
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"recognized": {
"use": ":original",
"robot": "/image/ocr",
"provider": "gcp",
"format": "text"
},
"exported": {
"use": [":original", "recognized"],
"robot": "/s3/store",
"credentials": "YOUR_S3_CREDENTIALS_NAME"
}
}
}
Mantén tu Auth Secret de Transloadit fuera del bundle de iOS. Crea las firmas en tu backend como se describe en la documentación de autenticación y luego deja que la app haga la subida con los parámetros firmados. Consulta TransloaditKit para conocer la superficie del SDK de iOS y usa la demo de OCR en vivo (English) para inspeccionar el flujo de trabajo de metadatos antes de integrarlo.
Los proveedores en la nube que hay detrás del Robot de OCR pueden actualizar sus modelos, así que no afirmes un texto de OCR exacto en pruebas de larga duración. Evalúa documentos representativos, guarda el proveedor y la configuración utilizados, y diseña el código posterior para que tolere errores de reconocimiento.
Mejora la precisión del OCR
- Captura la mayor resolución útil sin estirar una imagen de origen pequeña.
- Corrige la orientación antes del reconocimiento.
- Recorta hasta el documento o la región de texto cuando la escena circundante sea irrelevante.
- Prefiere una iluminación uniforme y evita los reflejos, el desenfoque por movimiento y la perspectiva pronunciada.
- Define los idiomas de reconocimiento de forma deliberada cuando se conozca el idioma probable.
- Agrega términos específicos del dominio con
customWordscuando Vision los corrija de forma incorrecta. - Mantén los umbrales de confianza y la revisión humana proporcionales a la consecuencia de un resultado erróneo.
Preguntas frecuentes
¿Cuál es la mejor biblioteca de OCR para iOS?
Para los idiomas compatibles y el texto normal en imágenes, Apple Vision es la opción predeterminada porque es un framework propio del sistema y no requiere ningún binario de OCR de terceros. VisionKit es la opción de más alto nivel para el escaneo con la cámara en vivo. Usa otro motor solo después de que un requisito concreto de idioma, modelo o despliegue descarte esas opciones.
¿Debería usar SwiftyTesseract en una nueva app de iOS?
No. Su repositorio está archivado y dice explícitamente que no recibirá más actualizaciones. Una aplicación existente puede necesitar una migración medida, pero el trabajo nuevo no debería adoptarlo como una dependencia con mantenimiento.
¿El OCR en iOS requiere conexión a la red?
El reconocimiento de Apple Vision se ejecuta en el dispositivo. Una Assembly de OCR de Transloadit es un servicio de red y resulta apropiada cuando el procesamiento debe continuar en un flujo de trabajo de backend.
¿Cómo debería probar el OCR?
Usa un conjunto de fixtures que represente tus idiomas, tipografías, condiciones de cámara y diseños de documento reales. Verifica criterios de aceptación a nivel de aplicación, como la presencia de los campos obligatorios, en lugar de una transcripción exacta para cada imagen.
