Hay alguna macro de preprocesador para compilar ciertas partes de código sólo si la Base SDK 7.0 o superior? El «__IPHONE_7_0» constante definida parece estar vinculado con el desarrollo de iOS de destino (y no a la base SDK).

Estoy usando XCode 5 con iOS 7 y iOS 6.1 instalado.

La razón por la que estoy pidiendo esto es que actualmente estoy en la transición de una aplicación de iOS 6 a iOS 7. Hay muy pocas cosas para ajustar, y me gustaría actualmente todavía como para compilar mi aplicación con el iOS 6.1 como base SDK (y con la meta del desarrollo iOS 6.0), pero ya como para añadir algo de código que voy a querer para siempre que puedo compilar con el SDK de iOS 7, pero que no se compila si la base SDK de iOS 6.1.

Ejemplo:

if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [_tableView setSeparatorInset:UIEdgeInsetsZero];
}

Esta por encima de la pieza de código no compila con iOS 6.1 SDK base, como se queja acerca de setSeparatorInset no está definido para UITableView. Por lo tanto me gustaría incluir este fragmento de código dentro de una directiva de preprocesador, condicionalmente en el SDK base.

  • ¿Por qué aún la compilación de usted de la aplicación con el SDK de iOS 6 al migrar a la de iOS 7 SDK?
  • Porque hay bastante un par de problemas que tengo que ordenar que no he terminado todavía (algunos de interfaz de usuario artefactos que parezca extraña con el nuevo iOS7 SDK), pero lo que necesito para compilar una versión rápida ahora para ordenar una urgente error.
InformationsquelleAutor quentinadam | 2013-11-05

5 Comentarios

  1. 42

    Usted debe leer de Apple El SDK de la Guía de Compatibilidad de donde todas aquellas técnicas que se explican.

    En particular, se recomienda el uso de las __IPHONE_OS_VERSION_MIN_REQUIRED macro para probar en contra de la Destino de la Implementación de su proyecto (mínimo versión compatible), y en su caso utilizar el __IPHONE_OS_VERSION_MAX_ALLOWED macro para probar el SDK Base utilizada para la compilación.


    Ejemplo:

    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    //Only COMPILE this if compiled against BaseSDK iOS7.0 or greater
    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
       //Even when compiled with BaseSDK 7, only EXECUTE that if the user uses an
       //OS that support this method (namely if the user is running iOS7 or later,
       //but not for users running iOS6).
       [_tableView setSeparatorInset:UIEdgeInsetsZero];
    }
    #endif

    Nota importante: Usted debe utilizar las constantes numéricas en su comparación, ya que si se prueba #if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0 por ejemplo no funciona cuando se utiliza el SDK de 6, como __IPHONE_7_0 no está definido por lo tanto evaluadas a 0 en ese contexto y su condición no funcionan como se esperaba.

    • Gracias, pensaba que iba a funcionar, pero aún así, si el desarrollo meta es iOS 6, luego me sale __IPHONE_OS_VERSIÓN_MAX_PERMITIDA = 60100 (incluso si la Base de SDK de iOS 7). Sería necesario para establecer la meta del desarrollo para iOS 7 para que la condición de trabajo.
    • Yo siempre uso __IPHONE_OS_VERSION_MAX_ALLOWED ya un tiempo, incluso para proyectos públicos desplegados en GitHub y utilizados por una gran cantidad de personas — algunos siguen usando Xcode4/SDK6, algunos con Xcode5/SDK7, todos con varias Destino de la Implementación de configuraciones — y en mi experiencia, __IPHONE_OS_VERSION_MAX_ALLOWED es siempre 70000 cuando se construye con Xcode5/SDK7, contrario a __IPHONE_OS_VERSION_MIN_REQUIRED que depende de la Implementación de Destino. Por supuesto, en cualquier caso, yo siempre uso las «Últimas» del SDK en la configuración de generación (nunca se debe cambiar), pero acaba de cambiar la versión de Xcode utilizado.
    • Además, ¿la has leído la documentación recordado a mi enlace? Que explicar en que caso se debe utilizar __IPHONE_OS_VERSION_MAX_ALLOWED y en el que caso de que usted no necesita y lo demás correcto de las técnicas a utilizar para lograr este tipo de cosas.
    • He leído el enlace proporcionado y de hecho estoy yo muy sorprendida de tener a __IPHONE_OS_VERSIÓN_MAX_PERMITIERON regresar __IPHONE_6_1 con la siguiente configuración: XCode 5 con el SDK de iOS 7 y iOS SDK 6.1 instalado, el desarrollo meta iOS 6.0 y base SDK de iOS 7.
    • Instaló SDK6 en el interior de su Xcode5?! (probablemente por la copia del directorio en el Xcode.aplicación del lote de su edad Xcode4 a su nuevo Xcode5 supongo?) Este Puede ser el origen de este extraño comportamiento, a continuación,. Sugiero que usted mantenga un Xcode4.aplicación, si usted necesita para construir con SDK6 y tenemos y Xcode5.aplicación cuando se necesita compilar con SDK7 (y quitar el SDK6 copió en Xcode5). Esto es lo que tengo que hacer (tengo Xcode4.aplicación y Xcode5.aplicación en mi desarrollo de Mac aquí) y no problema con __IPHONE_OS_VERSION_MAX_ALLOWED.
    • Sí tengo XCode 5 y agregar manualmente el SDK de iOS 6.1. Yo probable que se deben tratar con XCode 4 instalado a un lado. Todavía no estoy 100% convencido de que voy a ser capaz de tener lo que yo quiero (ser capaz de marcar un pedazo de código de no ser compilado dependiendo de la versión del SDK)
    • Wow, yo tenía el mismo problema: cuando me he quitado el 6.1 SDK desde el paquete de Xcode, todo funcionaba correctamente.

  2. 20

    Sí, usted puede usar la __IPHONE_7_0 definir:

    #ifdef __IPHONE_7_0
        if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
            [_tableView setSeparatorInset:UIEdgeInsetsZero];
        }
    #endif
    • Ya había intentado eso, pero si la meta del desarrollo es iOS 6.1 (pero la base SDK de iOS 7), a continuación, __IPHONE_7_0 no está definida, por lo que no se ajusta a mi propósito.
    • Sí, y eso es correcto, por lo tanto cuando __IPHONE_7_0 no está definido el código que está entre el #ifdef y #endif no se compila. Si usted compilar el mismo código con el SDK de iOS 7 el código está incluido.
    • Que no es el caso. Si me puse la base del SDK para iOS 7, el trozo de código no se compila (para que se pueda compilar, yo también deberá establecer la meta del desarrollo para iOS 7, que no es lo que quiero). Estoy buscando un preprocesador condición que compila el código si la base SDK de iOS 7 o superior, independientemente del valor de la meta del desarrollo (que de hecho me gustaría seguir en iOS 6)
    • Raro, yo estoy haciendo lo mismo, y para mí es trabajo. Aunque estoy usando Xcode 4.6 cuando se hace cualquier compilación para el SDK de iOS 6.
    • Lamentablemente esto no siempre es cierto. Ahora el SDK en XCode 7.3.1 para iOS 9, pero los encabezados tienen un #define para __IPHONE_10_0.
  3. 12

    Como por Apple Doc debe utilizar NSFoundationVersionNumber distinguir entre iOS 7 y otros. Se puede hacer más simple el uso de las siguientes macros:

    #define isIOS6 floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1 
    #define isIOS7 floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1

    y luego más tarde en el código de

    #ifdef __IPHONE_7_0
        if (isIOS7) {
           //Do additional stuff for iOS 7.
        } 
    #endif

    Sí usted debe comprobar en tanto en tiempo de compilación (con #ifdef) y de tiempo de ejecución (con isIOS7) de esta manera usted será capaz de compilar con iOS6 SDK , iOS7 SDK, y también iOS7 SDK con un iOS6 destino.

    OH! Recuerde que usted no puede hacer if (!isIOS7) tienes que utilizar if (isIOS6).

    https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/

    • Si por isIOS6 te refieres a 6.1 o anterior, debe ser <=.
    • Gracias por darse cuenta de que. Me he fijado tanto en las definiciones.
    • Se puede evitar el uso de suelo para el mayor de comparación, a continuación, compare >= con 7. De esa manera usted no tiene que confiar en el hecho de que 7 de la siguiente manera 6.1 con nada entre
    • Usted no puede hacer eso, porque en iOS6 SDK no tiene NSFoundationVersionNumber_iOS_7 definición.
  4. 3

    También, usted puede utilizar esta macro

    #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)

    e.g if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.1")) {[self doSomething];} else {[self doSomethingElse];}

    • Esta es una buena comprobación en tiempo de ejecución, pero la pregunta es acerca de en tiempo de compilación versión del SDK.
    • Buen código, bro, mantener el buen trabajo.
    • No compruebe la versión del sistema, pero la comprobación de la versión del SDK como: if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) para iOS 6 o inferior. Así como Apple menciona en no iOS 7 interfaz de usuario Guía de Transición
  5. 2

    No deberías de probar el sdk pero para la disponibilidad de los métodos de la clase en mi humilde opinión. Así que no con un precompilado en todos los

    • Pero en algún momento, especialmente en las bibliotecas, usted quiere ser capaz de detectar el SDK para incluir algunas de las características o de nuevos métodos. que siempre se puede hacer con la detección de un método o clase.
    • «el que puede» o «que no se puede» ? que me puedes decir acerca de esta característica?
    • MENTE: hago uso de las macros que se mencionan aquí y entiendo totalmente que hay una excepción que confirma la regla’, razón por la cual yo no voto que 😀 (sólo bromeo!)
    • A veces usted tiene que probar la SDK en preprocesador nivel, debido a que los nuevos métodos no incluso compilar, cuando se llama desde las versiones de SDK.
    • aceptar que usted tiene que comprobar en las declaraciones. ok … no para la convocatoria que se mencionan aquí, pero bueno 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here