> ## Documentation Index
> Fetch the complete documentation index at: https://docs.markpdf.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# guía marco

> Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.

# Guía marco

## Expo vs React Native desnudo

`@markpdf/react-native` no depende de ningún módulo nativo propio: utiliza `fetch`/`FormData`/`XMLHttpRequest` global, disponible en ambos. La diferencia está en qué selector utiliza para obtener el `uri`/`name` del archivo.

### Expo: `expo-document-picker`

```bash theme={null}
npx expo install expo-document-picker
```

```tsx theme={null}
import * as DocumentPicker from "expo-document-picker";

const result = await DocumentPicker.getDocumentAsync({ type: "application/pdf" });
if (!result.canceled) {
  const asset = result.assets[0]; // { uri, name, mimeType, size }
}
```

No requiere permisos adicionales en `app.json`: el selector de archivos del sistema operativo maneja el acceso.

### Enfermero registrado desnudo: `react-native-document-picker`

```bash theme={null}
npm install react-native-document-picker
cd ios && pod install
```

```tsx theme={null}
import DocumentPicker from "react-native-document-picker";

const [file] = await DocumentPicker.pick({ type: [DocumentPicker.types.pdf] });
// { uri, name, type, size }
```

En Android, verifique que su `targetSdkVersion` sea compatible con la versión de `react-native-document-picker` que instala; las versiones recientes de Android Scoped Storage cambian la forma en que se resuelven los `content://` URI. Siga la guía de instalación del paquete para su versión de RN.

## Permisos

Ni `expo-document-picker` ni `react-native-document-picker` requieren permisos de almacenamiento explícitos en la mayoría de los casos; ambos delegan en el selector de archivos nativo del sistema (Selector de documentos en iOS, Storage Access Framework en Android), que no necesita `READ_EXTERNAL_STORAGE`. Si su aplicación también necesita acceder a la galería de fotos para adjuntar imágenes escaneadas, use `expo-image-picker` (Expo) o `react-native-image-picker` (desnudo) y siga sus requisitos de permiso separados, que son independientes de `@markpdf/react-native`.

## ¿Dónde vive la clave API?

A diferencia de una aplicación web, un binario de aplicación móvil no tiene un "servidor" que proporcione variables de entorno en tiempo de ejecución; cualquier cadena incrustada en el paquete JS puede ser eliminada por alguien con `.ipa`/`.apk`. Opciones, de más a menos seguras:

1. **Proxy en su backend** (recomendado para producción): la aplicación llama a su propio punto final, que a su vez llama a markpdf con la clave guardada en el lado del servidor. La aplicación nunca ve la clave markpdf.
2. **Clave integrada de privilegios bajos**: si no tiene su propio backend, use una clave dedicada solo a esa aplicación, con límites de uso y facturación limitados, suponiendo que pueda filtrarse.
3. **Construir variables de entorno** (`EAS Secrets` en Expo, `.env` + `react-native-config` en bare): evitan codificar la clave en el código fuente versionado, pero **no** evitan que termine en el paquete descompilable final. Útil para no enviar la clave al repositorio, no para ocultarla al usuario final.

```ts theme={null}
// Expo: read at build time from EAS Secrets/app.config.ts -> extra
import Constants from "expo-constants";
const client = new MarkpdfClient({ apiKey: Constants.expoConfig?.extra?.markpdfApiKey });
```

<Warning>
  Si su aplicación maneja documentos confidenciales de usuarios reales, use la opción 1 (proxy en su backend). Una clave incrustada en el binario, incluso si no está en el repositorio, aún se puede eliminar con herramientas de descompilación estándar.
</Warning>

## Networking en segundo plano

Cargar archivos PDF grandes desde el selector puede llevar tiempo; Si el usuario minimiza la aplicación durante la carga, iOS/Android puede suspender la tarea de red según el sistema operativo y el estado de la aplicación. Para cargas en segundo plano largas y confiables, considere una biblioteca de carga en segundo plano (por ejemplo, `react-native-background-upload`) en lugar de depender de `fetch`/`XMLHttpRequest` para sobrevivir indefinidamente con la aplicación en segundo plano; esta es una limitación general de RN, no específica de `@markpdf/react-native`.
