但是我不认为 iAP 破解工具属于特定的应用程序。我认为我可以通过调用“Url Scheme”来检查,但我不知道名称。有人知道怎么做吗?
需要说明的是,这需要大量的工作 - 我们花费了几周程序员的时间来确保其顺畅运行,尽管现在有一些开源代码可以处理步骤2和3。重启步骤还需要支持和公关成本 - 不可避免地,有些人可能会更改iTunes帐户或没有互联网连接等,他们可能会因为短暂失去他们合法购买的东西而感到非常生气。
当你的应用只提供给越狱用户使用(也就是说,大约90%的潜在客户不受影响)并且大多数安装它的人可能不会为您的应用付款时,您需要权衡是否值得投入时间去做这件事;不要被破解您的应用的用户数量所吓倒,许多人即使从来不会付钱也会愉快地下载免费应用。你可能最好把时间投入到受益于合法用户的改进上(并鼓励更多人购买你的应用程序)。
编辑 一年后,这仍然(大部分)准确,但为了处理今天宣布的新破解方式,即截获并重新发送真实收据,服务器端现在需要更多的工作。(幸运的是,如果您已经设置了验证服务器,则应该能够在不更新应用程序的情况下进行操作)两个新要求:
1)检查从Apple服务器获取的解密后的收据中的产品ID(应用程序ID和IAP产品ID)是否与用户购买的产品匹配。
2)通过记录以前使用过的交易ID,检查收据中的交易ID(或恢复收据的恢复交易ID)是否曾经被使用过。
即使现在非越狱用户也可以破解IAP,但我的基本观点仍然是,这可能比它值得的麻烦更多 - 为了回收您将花费实现和维护一系列极其无聊代码的时间,您需要从那些非常不愿意付款而愿意妥协自己iPhone安全以避免付款的人那里获得大量额外销售额。
苹果在这里指出了这个问题:iOS上应用内购买收据验证
根据这段文字所描述的,您需要在交易完成后验证您的交易,这样就可以解决这个问题了(希望如此)。
要检测IAP Cracker,您可以使用NSFileManager
检查已安装的软件包。我已经尝试过使用Cydia来检测越狱,它可以正常工作。
由于Cydia会自动安装在每个越狱设备上,因此您可以像这样检查越狱:
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]){
NSLog(@"Jailbreak detected");
}
IAP Cracker只是一个软件包,也安装在您的系统中,您也可以检查它。
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/DynamicLibraries/iap.dylib"]){
NSLog(@"IAP Cracker detected");
}
有人知道这是否违反了苹果的一些指南吗?
本周将在应用程序中提交此内容(2015年5月)。因此,我们将看到苹果是否批准。
+(BOOL)isJailbroken {
#if (TARGET_IPHONE_SIMULATOR)
return NO;
#endif
#ifndef IS_APP_EXTENSION
NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
BOOL doesHaveCydia = [[UIApplication sharedApplication] canOpenURL:url];
if (doesHaveCydia) {
return YES;
}
NSError* error=nil;
NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/System" error:&error];
//NSLog(@"blah %i error %@",(int)[files count], error);
if (error==nil) {
//A non-jailbroken device will have an operation not permitted error.
//Jailbroken device should have a list of files and a nil error.
if (files) {
NSLog(@"jailbreak? %i",(int)[files count]);
}
return YES;
}
return NO;
#else
return NO;
#endif
}
NSFileManager
方法由 @Morpheus2002 编写的对我不起作用,而且可能违反了苹果公司的准则。如 @MarkJohnson 所建议的那样,要检查 Cydia 是否已安装以及设备是否越狱,可以检查是否可以打开 cydia://home
URL 方案。
if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://home"]]) {
NSLog(@"Jailbreak is not detected");
} else {
NSLog(@"Jailbreak is detected");
}