是否可以在 iOS 应用程序中以某种方式编写如下代码?
if(app is live in app store)
{
//Do something
}
else
{
//Do other thing
}
我想避免我们的 QE/开发团队使用应用程序进行测试的情况。有没有办法可以检测应用程序代码的签名方式(开发人员/临时/分发)以进行检查?即使有可能,也不能消除苹果使用我们的应用程序进行测试作为审查的一部分的情况。在我们的应用程序在 App Store 上线之前,我们记录了 Apple 对我们内容的多次下载。
您可以通过检查是否存在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 团队将遵循“不是来自应用程序商店”路径。让我的损失成为你的收获。 :)
在 iOS 7 及更高版本上,您还可以检查:
if ([NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] != nil) {
// Downloaded from App Store
} else {
// Not downloaded from App Store
}
这不再适用于 Xcode 7, 我建议使用新的 HockeyApp 解决方法。
这是一个简化版本:
+ (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
}
我在我的应用程序中遇到了类似的情况。至少我认为我做到了,我不确定我是否完全理解你的问题。
在我的应用程序中,我让拥有帐户的用户创建内容。我不希望开发者内容(或 Apple 员工内容)污染公共内容。我在用户数据结构中有一个“测试”位,该位被打开,并且测试内容对公众不可见。我尚未向 App Store 提交,但我需要与 Apple 合作以确保他们的帐户已打开此测试位。
如果这不是您的目标,那么没关系! :- )
对于 Swift 版本:
private static let isTestFlight = NSBundle.mainBundle().appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"
这个完整的答案更详细地解释了如何使用它。
斯威夫特
func isAppStoreBuild() -> Bool {
if NSBundle.mainBundle().appStoreReceiptURL != nil {
if let _ = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
return true
}
}
return false
}