存储在应用程序钥匙扣中的应用程序采购收据中
-
12-11-2019 - |
题
我以前从未在应用程序购买中实现,所以我使用了Mkstorekit包装器并具有工作实现。 Mkstorekit将所有收据保留在UserDefaults中的所有收据作为BOOL,因此盗版是非常简单的,以便在“破解”状态下分配APP购买。一旦第一次购买,捆绑包就可以分发,并且可以重新创建。师可以使IAP解锁能够。
我想扩展MKStorekit以在iOS keychain中创建App采购验证数据。有没有任何缺点或可能的原因,无法支付用户,是不可靠的,或者任何其他原因为什么要这样做这一切我明白盗版是不可避免的,我绝对不想疏远付费用户,但我觉得Userdefaults .Plist是一种绕过的简单方法。
在我的场景中,在购买购买时将放入钥匙扣中的简单字符串。这样,如果二进制文件分布式,则尚未启用Unlockables。当然,有可能提出解决方法,但它需要更多的努力并且知道如何找到真/假标志并导致它始终返回正确的值。通过混淆,我甚至可以使其略难以跟踪。
谢谢你所有的见解,我感谢答案避免强制性的不可避免的盗版,处理它的回答。我对这个解决方案的技术有力更感兴趣。
解决方案
我们在我们的应用程序中完全做到这一点,它有效。它是您可以升级到完整版本的一个免费应用程序,我们将升级指示器存储在钥匙串中。升级指示器是您选择的任意字符串,但是对于钥匙串的目的,它被视为密码,即KSECVALUEDATA的值在钥匙串中加密。关于这种方法的一个很好的奖金是,如果用户删除应用程序,然后稍后重新安装它,则重新启用一切,因为keychain项目与应用程序分开存储。它对在用户默认的东西中储存某些东西的额外工作很少,以至于我们认为它是值得的。
如何创建安全项:
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
[dict setObject: (id) kSecClassGenericPassword forKey: (id) kSecClass];
[dict setObject: kYourUpgradeStateKey forKey: (id) kSecAttrService];
[dict setObject: kYourUpgradeStateValue forKey: (id) kSecValueData];
SecItemAdd ((CFDictionaryRef) dict, NULL);
.
这是如何找到安全项来检查其值:
NSMutableDictionary* query = [NSMutableDictionary dictionary];
[query setObject: (id) kSecClassGenericPassword forKey: (id) kSecClass];
[query setObject: kYourUpgradeStateKey forKey: (id) kSecAttrService];
[query setObject: (id) kCFBooleanTrue forKey: (id) kSecReturnData];
NSData* upgradeItemData = nil;
SecItemCopyMatching ( (CFDictionaryRef) query, (CFTypeRef*) &upgradeItemData );
if ( !upgradeItemData )
{
// Disable feature
}
else
{
NSString* s = [[[NSString alloc]
initWithData: upgradeItemData
encoding: NSUTF8StringEncoding] autorelease];
if ( [s isEqualToString: kYourUpgradeStateValue] )
{
// Enable feature
}
}
.
如果upgradeItemdata为nil,则键不存在,因此您可以假设升级不是在内或我们所做的,以易于升级的值。
更新
添加了ksecreturndata(谢谢@luis指出它)