App Thinning y el error: ENABLE_BITCODE

XCode_Objective-C

Con la introducción de iOS 9 de forma oficial hace unas semanas, es hora de mirar un poco más de cerca los temas que nos afectarán con el cambio al momento de adaptar nuestro código de una versión a otra. En esta entrega hablaré sobre App Thinning y el error que nos arroja Xcode 7 al migrar nuestros proyectos creados en versiones anteriores: ENABLE_BITCODE.

App Thinning

ENABLE_BITCODE: ¿Qué rayos es esto? cuando ejecutas tu app en Xcode 7, nos aparece este error (si estás migrando tu proyecto). Pues Apple nos indica en su documentación, que con la introducción del WatchOS y el tvOS aparece un nuevo término: “App Thinning”; un sistema de optimización que se ha implementado para disminuir el tamaño que ocupa el OTA de iOS 9 y además para ser aplicado a las aplicaciones que desarrollemos de ahora en adelante en cualquier SO (WatchOS, tvOS o iOS) lo que mejorará la experiencia de usuario.

Leamos el extracto:

The App Store and operating system optimize the installation of iOS and watchOS apps by tailoring app delivery to the capabilities of the user’s particular device, with minimal footprint. This optimization, called app thinning, lets you create apps that use the most device features, occupy minimum disk space, and accommodate future updates that can be applied by Apple. Faster downloads and more space for other apps and content provides a better user experience.

Así pues, App Thinning posee tres componentes:

1.- Slicing (iOS, tvOS)

Básicamente es un proceso que crea y pone a disposición diferentes variaciones del bundle (la arquitectura ejecutable y los recursos que necesita un target específico) de la app dependiendo del target seleccionado. Todo esto lo hace App Store al momento de subir la aplicación;  las imágenes, por ejemplo, son divididas de acuerdo a la resolución de cada dispositivo, de este modo se reduce notablemente el tamaño que ocuparía una app hecha para iOS y tvOS al momento de instalarse en un iPhone.

Slicing is the process of creating and delivering variants of the app bundle for different target devices. A variant contains only the executable architecture and resources that are needed for the target device. You continue to develop and upload full versions of your app to iTunes Connect. The App Store will create and deliver different variants based on the devices your app supports. Image resources are sliced according to their resolution and device family. GPU resources are sliced according to device capabilities. For tvOS apps, assets in catalogs shared between iOS and tvOS targets are sliced and large app icons are removed. When the user installs an app, a variant for the user’s device is downloaded and installed.

Todo este proceso lo realiza de forma automática Xcode cuando genera el archivo binario que se subirá a Apple Store. Posteriormente, Apple Store verificará la versión del dispositivo que usa cada usuario al momento de descargar la app e instalará solo los recursos necesarios para esa arquitectura.

2.- Bitcode (ENABLE_BITCODE)

Y lo que nos atañe realmente es esta sección, Bitcode. De acuerdo a la documentación, es la representación intermedia de un programa compilado, es decir, que al momento de subir nuestra app al App Store, si Apple considera necesario alterar el ejecutable de nuestra aplicación (usualmente para re-optimización), podrá hacerlo sin necesidad de que nosotros creemos un nuevo binario y tengamos que subirlo nuevamente. Sin embargo, no puede ejecutarse en todas las arquitecturas, sino en x86 o ARM. De hecho, esta funcionalidad solo es posible obtenerla en Xcode 7, por lo que  al momento de utilizar nuestro proyecto desarrollado en Xcode 6 ahora en la versión de Xcode 7, nos aparece un error como el siguiente:

Bitcode error Xcode 7 - ENABLE_BITCODE 

No solo tenemos que habilitar la opción en nuestro target, sino que todos los frameworks que utilicemos (incluidos los de 3eros …ejem, cocoapods, ejem Parse, ejem Bolts, ejem etc) además de las apps de watchOS también deben habilitarlo. Por ahora, esta funcionalidad es opcional, pero no pasará mucho tiempo hasta que Apple nos obligue a utilizarla. Mientras tanto, hay que darle tiempo a los desarrolladores de frameworks para que se adapten y adopten esta nueva funcionalidad. Así que puedes cambiar el flag a NO en la sección “Bulid Settings“.

Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.

Xcode hides symbols generated during build time by default, so they are not readable by Apple. Only if you choose to include symbols when uploading your app to iTunes Connect would the symbols be sent to Apple. You must include symbols to receive crash reports from Apple.

3.-  On-Demand Resources (iOS, tvOS)

Esta funcionalidad promete mejorar las descargas de aplicaciones y recursos (como fotos y audios) al etiquetarlas con palabras claves mientras las solicitamos grupalmente. Significa que App Store alojara los recursos y gestionará las descargas por nosotros, lo que permitirá descargas más rápidas y disminuirá el tamaño de las aplicaciones. Cuando queda poco espacio de disco o ya no se necesita esta funcionalidad, el sistema operativo lo depura automáticamente.

Esta opción debes configurarla en tu app, siguiendo las instrucciones documentacion on-demand resources y utilizar NSBundleResourceRequest.

Pues eso es todo por hoy. Ahora, ya un poco más informados sobre estas nuevas funcionalidades que ofrece Apple, habrá que comenzar a usarlas 🙂

 

 

 

 

 

Sofia Swidarowicz

I'm an iOS Software Engineer mostly. Known as phynet in the internez. I'm me, full of memory failure and lovely karma.

 

Leave a Reply

Your email address will not be published. Required fields are marked *