是否有可能以某种方式在iOS应用程序中编写如下代码?
if(app is live in app store)
{
//Do something
}
else
{
//Do other thing
}
我想避免我们的QE / Dev团队使用app进行测试的情况。有没有办法可以检测应用程序代码的签名方式(Developer / Adhoc / Distribution)?即使有可能,也不会消除Apple在审核时使用我们的应用进行测试的情况。在我们的应用程序在App Store上线之前,我们记录了Apple的许多内容下载。
答案 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更详细地解释了如何使用它。