检查iOS应用是否在应用商店中存在

时间:2012-03-28 11:26:01

标签: ios ios5 itunes itunesconnect itunes-sdk

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

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

我想避免我们的QE / Dev团队使用app进行测试的情况。有没有办法可以检测应用程序代码的签名方式(Developer / Adhoc / Distribution)?即使有可能,也不会消除Apple在审核时使用我们的应用进行测试的情况。在我们的应用程序在App Store上线之前,我们记录了Apple的许多内容下载。

6 个答案:

答案 0 :(得分:9)

您可以通过检查是否缺少embedded.mobileprovision来确定您的应用是否通过应用商店分发。此文件仅包含在adhoc版本中。

像这样:

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

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

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

答案 1 :(得分:4)

在iOS 7及更高版本中,您也可以查看:

if ([NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] != nil) {
    // Downloaded from App Store
} else {
    // Not downloaded from App Store
}

答案 2 :(得分: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
}

答案 3 :(得分:1)

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

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

如果这不是你的目标,那么,别担心! : - )

答案 4 :(得分:0)

夫特

func isAppStoreBuild() -> Bool {

    if NSBundle.mainBundle().appStoreReceiptURL != nil {
        if let _ = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
            return true
        }
    }
    return false
}

答案 5 :(得分:0)

对于Swift版本:

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

This complete answer更详细地解释了如何使用它。