Una trampa importante que aproveché hoy es la siguiente:
En muchos proyectos vi un solo objetivo de aplicación y con diferentes identificadores de paquete establecidos para cada configuración de ese objetivo. Aquí las cosas se complican. Lo que pretendían los desarrolladores era crear una aplicación de depuración para la configuración de depuración y una aplicación de producción para el objetivo de lanzamiento.
Si lo hace, ambas aplicaciones compartirán los mismos NSUserDefaults cuando estén configuradas así
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
Esto causa problemas en muchos lugares:
- Imagine que establece SÍ para una tecla cuando se le muestra al usuario una pantalla de introducción de la aplicación especial. La otra aplicación ahora también leerá SÍ y no mostrará la introducción.
- Sí, algunas aplicaciones también almacenan tokens de oAuth en sus valores predeterminados de usuario. De todos modos ... Dependiendo de la implementación, la aplicación reconocerá que hay un token y comenzará a recuperar datos usando el token incorrecto. Es muy probable que esto falle con errores extraños.
La solución a este problema en general es prefijar las claves predeterminadas con la configuración actual construida. Puede detectar la configuración fácilmente en tiempo de ejecución estableciendo diferentes identificadores de paquete para sus configuraciones. Luego, lea el identificador de paquete de NSBundle.mainBundle()
. Si tiene los mismos identificadores de paquete, debe configurar diferentes macros de preprocesador como
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
En Swift se verá casi igual:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif