> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/merchant-tokenization/es/integracion-del-sdk/security/ios.md).

# iOS

## IOS01. Prevención de fugas de datos sensibles <a href="#ios01-preventing-sensitive-data-leaks" id="ios01-preventing-sensitive-data-leaks"></a>

Use los siguientes métodos para gestionar datos sensibles en el ciclo de vida de la aplicación:

* `applicationWillResignActive`: Para limpiar la pantalla y cifrar los datos sensibles mostrados. Para limpiar la pantalla, se puede usar el siguiente código para ocultar el contenido mostrado:

```swift
UIApplication.shared.keyWindow.hidden = true
```

* `applicationDidBecomeActive`: Para mostrar y descifrar datos sensibles.
* `UIScreenCapturedDidChangeNotification`: Para detectar la grabación de pantalla. La aplicación debe limpiar la visualización y cifrar cualquier dato sensible.

## IOS02. Eliminar símbolos de la salida de Xcode <a href="#ios02-remove-symbols-from-xcode-output" id="ios02-remove-symbols-from-xcode-output"></a>

La aplicación debe eliminar todos los símbolos del binario final de lanzamiento.

Se recomienda establecer las siguientes configuraciones en el proyecto Xcode para eliminar la información de depuración y otros símbolos:

```swift
DEPLOYMENT_POSTPROCESSING = YES
GCC_GENERATE_DEBUGGING_SYMBOLS = NO
STRIP_INSTALLED_PRODUCT = YES
STRIP_STYLE = all
COPY_PHASE_STRIP = YES
```

## IOS03. Gestión de datos sensibles en Swift <a href="#ios03-management-of-sensitive-data-in-swift" id="ios03-management-of-sensitive-data-in-swift"></a>

La aplicación debe asegurarse de que todos los datos sensibles se gestionen adecuadamente. Como el tipo de valor de [Data](https://developer.apple.com/documentation/foundation/data) es Swift, punteros adicionales asignados a los datos darán lugar a una nueva copia de los bytes asignados.

Dichas prácticas deben minimizarse para mitigar la cantidad de bytes sensibles asignados.

Los bytes asignados se pueden pasar como un `inout` argumento para pasar por referencia y ser borrado una vez que su uso haya concluido.

El siguiente fragmento de código demuestra cómo pasar los bytes asignados como un `inout` argumento:

```swift
func helloWorld(_ data: inout Data) {
	...
}

var data = Data()
helloWorld(&data)
```

El siguiente fragmento de código demuestra cómo borrar una `Data` variable:

```swift
extension Data {
    internal mutating func wipe() {
        guard count > 0 else {
            return
        }
        let length = count
        withUnsafeMutableBytes { ptr in
            if let mutableRawPtr = ptr.baseAddress {
                memset_s(mutableRawPtr, length, 0, length)
            }
        }
    }
}
```

## IOS04. Desactivar la caché de autocorrección para entradas sensibles <a href="#ios04-disable-auto-correction-cache-for-sensitive-input" id="ios04-disable-auto-correction-cache-for-sensitive-input"></a>

La aplicación debe desactivar la caché de autocorrección para las entradas que soliciten datos sensibles. Esto evita que un atacante con acceso al dispositivo utilice las cadenas sugeridas por autocompletar para ver los datos de entrada de texto sensibles.

La aplicación puede realizar una de las siguientes acciones para desactivar la caché de autocorrección:

* Establecer el `secureTextEntry` campo a `true`.
* Establecer el `autoCorrectionType` campo a `UITextAutocorrectionType.no`.

## IOS05. Desactivar copiar/pegar para datos sensibles <a href="#ios05-disable-data-copypaste-for-sensitive-data" id="ios05-disable-data-copypaste-for-sensitive-data"></a>

La aplicación debe desactivar el menú de copiar/pegar para datos sensibles. Esto evita que un atacante con acceso al dispositivo pegue y vea los datos copiados. El siguiente código de ejemplo desactiva el menú de copiar/pegar:

```swift
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    let menuController = UIMenuController.shared
    menuController.isMenuVisible = false
}
```

## IOS06. Gestión de versiones de la aplicación en el App Store <a href="#ios06-managing-app-versions-in-the-app-store" id="ios06-managing-app-versions-in-the-app-store"></a>

Es posible que los usuarios vuelvan a descargar versiones anteriores de la aplicación que ya estén compradas o instaladas, permitiendo a los clientes usar aplicaciones en dispositivos más antiguos que pueden ya no ser compatibles con la versión actual de su aplicación. Si no desea poner estas versiones a disposición, puede gestionar la disponibilidad de las versiones anteriores de sus aplicaciones en la sección Derechos y Precios del módulo Administrar sus apps en App Store Connect.

Para más detalles, consulte [AppStore Connect](https://developer.apple.com/support/app-store-connect/).

Desde el punto de vista de la seguridad, se recomienda mantener la superficie de ataque lo más pequeña posible. Si bien mantener versiones antiguas proporciona una audiencia mucho más amplia, también puede exponer la solución a firmware antiguo cuya seguridad ya podría haber sido comprometida. Es mejor usar una versión de su aplicación (la más reciente) disponible a la vez y, en su lugar, configurar sus ajustes de compilación para admitir versiones más amplias de iOS.

**Desactivar el “Simulador” de la app en el objetivo de despliegue**

El objetivo de despliegue solo debe incluir dispositivos iOS.

**Desactivar la “Disponibilidad para Mac con Apple Silicon” de la app en App Store Connect**

Ejecutar una aplicación iOS en Mac M1 es mucho menos seguro porque es más fácil acceder tanto al binario de la aplicación como a los datos de la sandbox.

Desactive la “Disponibilidad para Mac con Apple Silicon” de la app en App Store Connect para impedir su instalación en Mac M1 y así reducir el riesgo.

Para detalles sobre cómo desactivar la “Disponibilidad para Mac con Apple Silicon”, consulte el documento de Apple [aquí](https://developer.apple.com/documentation/apple-silicon/running-your-ios-apps-on-macos)

## IOS07. Prevención de la manipulación de la aplicación <a href="#ios07-preventing-the-tampering-of-the-application" id="ios07-preventing-the-tampering-of-the-application"></a>

Para evitar la modificación maliciosa del código de la aplicación, se recomienda verificar la integridad del binario de la aplicación en tiempo de ejecución. Esto se puede implementar en la aplicación calculando la suma de comprobación de la sección \_\_text del segmento \_\_TEXT.

Para detalles de implementación, consulte [enlace de github](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md). Se requiere una fuerte ofuscación para proteger el código que calcula la suma de comprobación.

Para los riesgos asociados con ataques de manipulación, consulte el enlace de OWASP en [enlace de OWASP](https://www.owasp.org/index.php/Mobile_Top_10_2016-M8-Code_Tampering).

## IOS08. Opciones de seguridad y ofuscación del compilador Xcode <a href="#ios08-xcode-compiler-security-and-obfuscation-options" id="ios08-xcode-compiler-security-and-obfuscation-options"></a>

La aplicación debe usar opciones de Xcode que incrementen la seguridad y proporcionen ofuscación haciendo que el desmontaje sea más complejo.

Se recomienda establecer las siguientes configuraciones en el proyecto Xcode:

```swift
GCC_UNROLL_LOOPS = YES
GCC_OPTIMIZATION_LEVEL = 3
OTHER_CFLAGS = -fstack-protector-all -finline-functions
CLANG_ENABLE_OBJC_ARC = YES
GCC_DYNAMIC_NO_PIC = NO
LD_NO_PIE = NO
RUN_CLANG_STATIC_ANALYZER = YES
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.payments.thalescloud.io/merchant-tokenization/es/integracion-del-sdk/security/ios.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
