Manera fácil de detectar si estoy usando framework no disponible para iOS más antiguo

Después de una session de encoding de maratón, donde agregué demasiado código sin hacer un seguimiento de todo, ahora tengo una aplicación que probablemente tenga algunas enumeraciones, llamadas y frameworks específicos de iOS 5.0 y 5.1; sin embargo, quiero que mi aplicación admita iOSes de nuevo a 4.3 .

Esperaba que hubiera una manera fácil de configurar Xcode para comstackr como si fuera compilation para iOS 4.3, de modo que obtendría errores para todo el código infractor que deba ser condicionado y / o, alternativamente, codificado, para mayores iOS

Pensé que obtendría eso usando la opción del comstackdor:

-D__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_3 

pero eso termina generando errores en los files del encabezado del sistema, no en mi código.

Dado que la mayoría de las lists y frameworks tienen su disponibilidad incluida en los files de encabezado, tengo que pensar que hay una manera fácil de hacer lo que necesito.

¿Alguien ha logrado hacer algo así sin recurrir a la descarga de Xcodes anteriores con SDK anteriores? Allí puedo encontrar el problema de los códigos X que no funcionarán correctamente en Lion (que es lo que estoy ejecutando).

ACTUALIZACIÓN: Parece que no puedo instalar Xcode 3.2.6 en Lion. Ahora tendré que encontrar una Mac Snow Leopard, a less que encuentre una manera de usar las opciones del comstackdor o forzando a Xcode a utilizar SDK antiguos …

Aquí hay una muestra de lo que hizo la respuesta de @ mattjgalloway:

Lumin App Group

/Users/mz/Dev/Working/Lumin/Lumin/MyUIScreen.m

  • 'brillo' está en desuso: ¡DEMASIADO NUEVO!
  • 'brillo' está en desuso: ¡DEMASIADO NUEVO!
  • 'brillo' está en desuso: ¡DEMASIADO NUEVO!
  • 'brillo' está en desuso: ¡DEMASIADO NUEVO!

/Users/mz/Dev/Working/Lumin/Lumin/LuminViewController+Share.m

  • 'TWTweetComposeViewController' está en desuso: ¡DEMASIADO NUEVO!
  • 'TWTweetComposeViewController' está en desuso: ¡DEMASIADO NUEVO!
  • 'TWTweetComposeViewController' está en desuso: ¡DEMASIADO NUEVO!

/Users/mz/Dev/Working/Lumin/Lumin/LuminViewController.m

  • 'scrollView' está en desuso: ¡DEMASIADO NUEVO!
  • 'connectionWithMediaType:' está en desuso: ¡DEMASIADO NUEVO!
  • 'connectionWithMediaType:' está en desuso: ¡DEMASIADO NUEVO!
  • 'AVCaptureDeviceSubjectAreaDidChangeNotification' está en desuso: ¡TAMBIÉN NUEVO!
  • 'setSubjectAreaChangeMonitoringEnabled:' está en desuso: ¡TAMBIÉN NUEVO!

Muy agradable.

Coloqué lo siguiente en el file .pch de mi proyecto, y estoy planeando hacerlo para todos los proyectos:

 #if DEBUG #define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_OS_VERSION_MIN_REQUIRED #import "MJGAvailability.h" #endif 

Para cualquier proyecto, ahora estoy automáticamente viendo los problemas de SDK basados ​​en el primer iOS que estoy apuntando. Si bien todavía pueden haber cambios en el SDK de los que tengo que preocuparme, al less conozco la mayoría de las incorporaciones al marco que no están disponibles para una versión anterior de iOS.

Eche un vistazo a mi MJGAvailability.h aquí en GitHub . Básicamente define el preprocesador correcto #define s para que las API más nuevas se vean como en desuso, por lo que obtendrá una advertencia del comstackdor. Hay algo de documentation en la parte superior del file, pero básicamente haces esto en tu file PCH:

 #define __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED __IPHONE_4_3 #import "MJGAvailability.h" 

Por si desea admitir hasta iOS 4.3.

Ciertamente, no es 100% infalible, pero me resulta increíblemente útil para hacer lo que me pides.

Si desea suprimir una advertencia porque quizás sabe que está bien usar esa API (la ha rodeado con un respondsToSelector por ejemplo), puede hacer algo como esto:

 UINavigationBar *navBar = self.navigationController.navigationBar; if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { #pragma clang diagnostic push #pragma clang diagnostic ignonetworking "-Wdeprecated-declarations" [navBar setBackgroundImage:[UIImage imageNamed:@"navbar_bg.png"] forBarMetrics:UIBarMetricsDefault]; #pragma clang diagnostic pop } 

Lo siento; sopló por completo esa respuesta la primera vez. Intentemos esto de nuevo …

  • Despliegue objective establece la versión del sistema operativo más baja con la que trabajará.
  • SDK establece la versión más alta del sistema operativo con la que trabajará

Entre Target de implementación y SDK, debe verificar condicionalmente las API. Consulte la Guía de compatibilidad de SDK para get más información al respecto.

Probablemente solo quiera usar el viejo SDK en su lugar.

La forma más fácil de usar SDK antiguos con versiones más recientes es save una copy del directory .sdk y copyrla en la nueva versión cuando actualice.

Sin embargo, puedes download las cosas viejas también. Apple solo lo esconde. Comience en las descargas para desarrolladores de Apple . Encuentra la copy de Xcode que quieras. Descargar Xcode 4.1 para Snow Leopard; Incluye iOS SDK 4.3. Puede instalarlo en paralelo con Xcode 4.3, pero no es necesario hacerlo. Monte el disco. Abre una terminal (es más fácil de esa manera). Vaya a / Volumes / Xcode / Packages. Encontrarás todos los SDK allí.

Puede intentar instalarlo directamente, y eso puede o no funcionar para usted. También puede descomprimir el .pkg y get los files que desee. Normalmente uso un progtwig llamado The Unarchiver . Puede desempaquetar casi cualquier cosa. Eso te dará un directory que incluye un file llamado "Carga útil". Si hace doble clic, se expandirá (es solo un file tar.gz que no incluye la extensión). Eso te dará el directory de plataforms. Copie eso en el directory de plataforms en su copy de Xcode y debería estar dorado.

Dicho todo esto, una vez que he conseguido que el sistema funcione bastante bien, por lo general, vuelvo a comstackr con el último y usando el objective de implementación. Facilita la queueboración con otras personas que no tienen el antiguo SDK. Y Apple puede o no rechazar debido a la vinculación con un antiguo SDK. Lo han hecho en el pasado; No sé la situación actual (no la he tenido en un time). Pero tiendo a recomendar enviar algo construido contra lo último.