Pregunta Cómo saber en tiempo de ejecución si una aplicación de iOS se está ejecutando a través de una instalación beta de TestFlight


¿Es posible detectar en tiempo de ejecución que una aplicación se ha instalado a través de TestFlight Beta (enviada a través de iTunes Connect) frente a App Store? Puede enviar un paquete de aplicaciones único y tenerlo disponible a través de ambos. ¿Hay una API que pueda detectar de qué manera se instaló? ¿O el recibo contiene información que permite que esto se determine?


74
2017-09-28 04:12


origen


Respuestas:


Para una aplicación instalada a través de TestFlight Beta, el archivo de recibo se llama StoreKit\sandboxReceipt vs lo usual StoreKit\receipt. Utilizando [NSBundle appStoreReceiptURL] puede buscar el SafeboxReceipt al final de la URL.

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSString *receiptURLString = [receiptURL path];
BOOL isRunningTestFlightBeta =  ([receiptURLString rangeOfString:@"sandboxReceipt"].location != NSNotFound);

Tenga en cuenta que sandboxReceipt es también el nombre del archivo de recibo cuando se ejecutan compilaciones localmente y para compilaciones que se ejecutan en el simulador.


79
2017-09-30 05:47



Residencia en respuesta combinatoria Creé la siguiente clase de ayuda SWIFT. Con esta clase puede determinar si se trata de una compilación de depuración, comprobación o tienda de aplicaciones.

enum AppConfiguration {
  case Debug
  case TestFlight
  case AppStore
}

struct Config {
  // This is private because the use of 'appConfiguration' is preferred.
  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
  }

  static var appConfiguration: AppConfiguration {
    if isDebug {
      return .Debug
    } else if isTestFlight {
      return .TestFlight
    } else {
      return .AppStore
    }
  }
}

Usamos estos métodos en nuestro proyecto para proporcionar diferentes seguimiento de id o Cadena de conexión por entorno:

  func getURL(path: String) -> String {    
    switch (Config.appConfiguration) {
    case .Debug:
      return host + "://" + debugBaseUrl + path
    default:
      return host + "://" + baseUrl + path
    }
  }

O:

  static var trackingKey: String {
    switch (Config.appConfiguration) {
    case .Debug:
      return debugKey
    case .TestFlight:
      return testflightKey
    default:
      return appstoreKey
    }
  }

ACTUALIZACIÓN 05-02-2016: Un requisito previo para usar una macro de preprocesador como #if DEBUG es establecer algunos indicadores personalizados de Swift Compiler. Más información en esta respuesta: https://stackoverflow.com/a/24112024/639227


36
2017-11-20 15:42



La versión Swift moderna, que representa simuladores (basada en la respuesta aceptada):

private func isSimulatorOrTestFlight() -> Bool {
    guard let path = Bundle.main.appStoreReceiptURL?.path else {
        return false
    }
    return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}

12
2017-08-16 21:10



Esto también funciona:

if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
    // TestFlight
} else {
    // App Store (and Apple reviewers too)
}

Encontrado en Detectar si la aplicación de iOS está descargada del Testflight de Apple


4
2018-05-02 20:03



Hay una forma en que lo uso para mis proyectos. Aquí están los pasos.

En Xcode, vaya a la configuración del proyecto (proyecto, no objetivo) y agregue la configuración "beta" a la lista:

enter image description here



Entonces necesita crear un nuevo esquema que ejecutará el proyecto en la configuración "beta". Para crear un esquema ve aquí:

enter image description here



Denomine este esquema lo que quiera. Debería editar las configuraciones para este esquema. Para hacer esto, toque aquí:

enter image description here



Seleccione la pestaña Archivo donde puede seleccionar Build configuration

enter image description here



Entonces necesitas agregar una clave Config con valor $(CONFIGURATION) la lista de propiedades de información de proyectos como esta:

enter image description here



Entonces es solo cuestión de lo que necesita en el código para hacer algo específico para la compilación beta:

let config = Bundle.main.object(forInfoDictionaryKey: "Config") as! String
if config == "Debug" {
  // app running in debug configuration
}
else if config == "Release" {
  // app running in release configuration
}
else if config == "Beta" {
  // app running in beta configuration
}

-2
2018-02-16 12:55