如何在运行时告诉iOS应用程序是否正在通过TestFlight Beta版运行

是否有可能在运行时检测到已通过TestFlight Beta(通过iTunes Connect提交)与App Store安装了应用程序? 您可以提交单个应用包,并通过它们提供。 是否有可以检测安装方式的API? 或收据是否包含允许确定此信息的信息?

combinatorial asked 2019-08-13T19:40:36Z
5个解决方案
94 votes

对于通过TestFlight Beta安装的应用程序,收据文件命名为sandboxReceipt,与通常的StoreKit\receipt相比。使用[NSBundle appStoreReceiptURL],您可以在URL的末尾查找sandboxReceipt。

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

请注意,sandboxReceipt也是在本地运行构建时以及在模拟器中运行构建时的接收文件的名称。

combinatorial answered 2019-08-13T19:40:58Z
46 votes

根据组合的答案,我创建了以下SWIFT助手类。 使用此类,您可以确定它是否为debug,testflight或appstore构建。

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
    }
  }
}

我们在项目中使用这些方法为每个环境提供不同的跟踪ID或连接字符串:

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

要么:

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

更新05-02-2016:使用#if DEBUG之类的预处理器宏的先决条件是设置一些Swift编译器自定义标志。 本答复中的更多信息:[https://stackoverflow.com/a/24112024/639227]

LorenzoValentijn answered 2019-08-13T19:41:39Z
23 votes

现代Swift版本,它考虑了模拟器(基于已接受的答案):

private func isSimulatorOrTestFlight() -> Bool {
    guard let path = Bundle.main.appStoreReceiptURL?.path else {
        return false
    }
    return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}
Serhii Yakovenko answered 2019-08-13T19:42:03Z
5 votes

更新

这不再起作用了。 使用其他方法。

原始答案

这也有效:

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

在检测iOS App是否从Apple的Testflight下载时发现

Marián Černý answered 2019-08-13T19:42:40Z
-3 votes

有一种方法可以将它用于我的项目。 这是步骤。

在Xcode中,转到项目设置(项目,而不是目标)并添加" beta" 配置到列表:

enter image description here



然后你需要创建一个新的方案,在" beta" 组态。 要创建计划,请访问:

enter image description here



将此方案命名为您想要的任何名 您应该编辑此方案的设置。 要执行此操作,请点击此处:

enter image description here



选择存档选项卡,您可以在其中选择Build configuration

enter image description here



然后你需要添加一个键Config,其值为$(CONFIGURATION)项目信息属性列表,如下所示:

enter image description here



然后就是你需要在代码中执行特定于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
}
Klemen Zagar answered 2019-08-13T19:43:48Z
translate from https://stackoverflow.com:/questions/26081543/how-to-tell-at-runtime-whether-an-ios-app-is-running-through-a-testflight-beta-i