我以前从未在应用程序购买中实现,所以我使用了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指出它)

github上的代码(arc variant)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top