15

是否可以在 iOS 应用程序中以某种方式编写如下代码?

if(app is live in app store)
{
   //Do something
}
else
{
  //Do other thing
}

我想避免我们的 QE/Dev 团队使用应用程序进行测试的情况。有没有一种方法可以检测应用程序代码的签名方式(开发人员/临时/分发)来检查?即使有可能,它也不会消除 Apple 使用我们的应用程序进行测试作为审查的一部分的情况。在我们的应用在 App Store 上线之前,我们记录了 Apple 对我们内容的多次下载。

4

6 回答 6

10

您可以通过检查是否缺少 embedded.mobileprovision 来确定您的应用程序是否通过应用商店分发。此文件仅包含在临时构建中。

像这样:

if ([[NSBundle mainBundle] pathForResource:@"embedded"
                                    ofType:@"mobileprovision"]) {
  // not from app store (Apple's reviewers seem to hit this path)
} else {
  // from app store
}

该技术来自HockeyApp SDK。我个人在商店中有使用这种技术的应用程序,当然还有许多分发的应用程序包括 HockeyApp SDK。

基于我在“来自应用商店”路径中的特定应用程序版本中意外发布的即时崩溃,Apple 团队将遵循“不是来自应用商店”路径。让我的损失成为你的收获。:)

于 2012-12-18T18:06:10.923 回答
4

在 iOS 7 及更高版本上,您还可以检查:

if ([NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] != nil) {
    // Downloaded from App Store
} else {
    // Not downloaded from App Store
}
于 2015-08-26T23:31:55.443 回答
3

这不再适用于 XCode 7,我建议使用新的 HockeyApp 解决方法https://github.com/bitstadium/HockeySDK-iOS/blob/6b727733a5a93847b4a7ff8a734692dbe4e3a979/Classes/BITHockeyHelper.m 这是一个简化版本:

+ (BOOL)isAppStoreBuild
{
#ifdef DEBUG
    return NO;
#else
    return ([UIApplication isTestFlightBuild] == NO);
#endif
}

+ (BOOL)isTestFlightBuild
{
#ifdef DEBUG
    return NO;
#else
    NSURL *appStoreReceiptURL = NSBundle.mainBundle.appStoreReceiptURL;
    NSString *appStoreReceiptLastComponent = appStoreReceiptURL.lastPathComponent;
    BOOL isSandboxReceipt = [appStoreReceiptLastComponent isEqualToString:@"sandboxReceipt"];

    return isSandboxReceipt;
#endif
}
于 2015-10-12T20:42:56.197 回答
1

我在我的应用程序中遇到了类似的情况。至少我认为我做到了,我不确定我是否完全理解你的问题。

在我的应用程序中,我让拥有帐户的用户创建内容。我不希望开发者内容(或 Apple 员工内容)污染公共内容。我在用户数据结构中有一个“测试”位,它被打开并且测试内容对公众不可见。我尚未提交到 App Store,但我需要与 Apple 合作以确保他们的帐户已打开此测试位。

如果这不是你的目标,那么,没关系!:-)

于 2012-03-28T11:43:03.437 回答
0

迅速

func isAppStoreBuild() -> Bool {

    if NSBundle.mainBundle().appStoreReceiptURL != nil {
        if let _ = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
            return true
        }
    }
    return false
}
于 2015-09-28T19:02:55.773 回答
0

对于 Swift 版本:

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

这个完整的答案更详细地解释了如何使用它。

于 2015-11-20T22:44:20.800 回答