2012-09-14 23 views
9

Preferiría usar la misma configuración de compilación para TestFlight vs. App Store. ¿Hay alguna manera de detectar en tiempo de ejecución si la aplicación se ha instalado a través de TestFlight o App Store? (Mi pensamiento es que sólo llamaré takeOff si no está instalado a través de la App Store.)¿Detecta TestFlight?

quiero evitar el uso de TestFlight en la App Store construye para proteger la privacidad de mis usuarios, y también para evitar el descarrilamiento potencial de las redes discutido here.

+0

¿Qué pasa con diferentes objetivos? – Jessedc

+0

Creo que rompería los archivos de Xcode. Creo que estoy haciendo la pregunta incorrecta aquí. A menos que alguien tenga una idea mejor, voy a agregar un interruptor TestFlight a mi aplicación y desactivarlo por defecto. –

+1

El archivo Xcode está bien con diferentes objetivos. A menudo uso objetivos diferentes para lanzamientos internos, otros para la tienda de aplicaciones. Permiten las mismas configuraciones (depuración, lanzamiento) pero puede configurar diferentes configuraciones de compilación para compilar los objetivos de TF fuera de producción/tienda de aplicaciones. – Jessedc

Respuesta

4

Creo que esto es lo suficientemente cerca de un duplicado de Check if iOS app is live in app store que esto se puede cerrar.

Puede determinar si su aplicación se distribuyó a través de la tienda de aplicaciones al verificar la ausencia de embedded.mobileprovision. Este archivo solo se incluye en compilaciones adhoc. De esto se deduce que si está distribuyendo compilaciones solo a través de TestFlight u HockeyApp y es no una compilación de tienda, debe ser una compilación TestFlight o HockeyApp.

De esta manera:

if ([[NSBundle mainBundle] pathForResource:@"embedded" 
            ofType:@"mobileprovision"]) { 
    // not from app store 
} else { 
    // from app store 
} 

Esta técnica es de the HockeyApp SDK.

+0

Supongo que no funcionará, ya que TestFlight acepta compilaciones de producciones en la sección de Apple – zaplitny

+1

Las versiones oficiales de las tiendas no deben incluir una 'embedded.mobileprovision'. Las nuevas versiones de iTunes Connect TestFlight pueden o no; probablemente deberías comprobarlo. –

+0

Confirmo que esta técnica ya no funciona desde 'iOS 9.1' + TestFlight con generación de producción. – loretoparisi

0

Se podría hacer algo similar a lo que los documentos sugieren para la llamada setDeviceIdenifier:

La prueba beta y liberación Diferenciación sección del SDK Documentation sugiere colocar lo siguiente antes de [TestFlight takeOff:@"api-token"];:

#define TESTING 1 
#ifdef TESTING 
    [TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]]; 
#endif 

Cuando llega el momento de lanzar la aplicación, se sugiere que comente la línea #define TESTING 1 para que la siguiente llamada a setDeviceIdentifier ser salteado Su código entonces el siguiente aspecto:

//#define TESTING 1 
#ifdef TESTING 
    [TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]]; 
#endif 

su solución

Para evitar takeOff de ser llamado se puede poner justo debajo setDeviceIdentifier y comentar #define TESTING 1, al igual que la sugerencia anterior. Lo que le daría:

//#define TESTING 1 
#ifdef TESTING 
    [TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]]; 
    [TestFlight takeOff:@"api-token"]; 
#endif 

HTH


Puede leer más sobre #ifdefhere si no está familiarizado.

+0

Está utilizando las macros del preprocesador están equivocadas, debe ponerlas en la clave 'Macros Preprocesador' en las Configuraciones de compilación de su proyecto. PERO se estableció que se necesita la misma configuración de compilación, por lo tanto, las macros del preprocesador darán el mismo valor, por lo que necesita saber la diferencia en el tiempo de ejecución, como Steven Fisher hizo en la respuesta correcta. Además, no utilizas la solución como comentarla, es muy amateur y fácil de olvidar. – Laszlo

1

Para determinar depuración, TestFlight o el despliegue AppStore en Swift:

private static let isTestFlight = NSBundle.mainBundle().appStoreReceiptURL?.lastPathComponent == "sandboxReceipt" 

    // This can be used to add debug statements. 
    static var isDebug: Bool { 
    #if DEBUG 
     return true 
    #else 
     return false 
    #endif 
    } 

fuente completo y la muestra: https://stackoverflow.com/a/33830605/639227

0

Here es un blog que muestra cómo agregar configuraciones adicionales, además de depuración y de lanzamiento (ex. Beta).

Y después de agregar la configuración Beta, crea otro esquema de proyecto. Y luego edita este nuevo esquema. En la sección Archivo, seleccione para usar la configuración Beta. Luego utiliza este esquema para archivar para Testflight y el esquema anterior para lograr la tienda de aplicaciones.