質問

以前にアプリの購入に実装されたことがないので、MkStorekitラッパーを使用していました。 MkStorekitは、すべての領収書をUserDefaultsに保持します。これにより、Pirateが「クラック化された」状態でアプリを購入するのに非常に簡単です。最初の購入が行われると、バンドルを分散させることができ、.plistを再作成してIAPのロック解除を可能にすることができます。

iOSキーチェーンでアプリの購入検証データを作成するようにMkStorekitを拡張したいと思います。これがユーザーに支払われ、信頼できない、またはそれがこれを行うのに全体的な悪い考えになる理由は失敗する欠点や可能な理由はありますか?私は違法行為が避けられないことを理解しています、そして私は間違いなくユーザーの支払いを廃止したくないが、私はuserdefaults .plistがバイパスする簡単な方法の多すぎると感じます。

私のシナリオでは、購入が行われたときに単純な文字列がキーチェーンに入れられます。そのように、バイナリが分散された場合、ロックロックがまだ有効になっていません。確かに、回避策を思い付くことは可能ですが、それはもう少し努力し、真偽の旗を見つけ、常に正しい値を返す原因となります。難読化を通して、私はそれを追跡することがわずかに困難にすることさえできます。

あなたのすべての洞察をありがとう、そして私は義務的な不可避的な違法行為を避けて、それを返信する答えを避けて感謝します。私はこのソリューションの技術的な生存度にもっと興味があります。

役に立ちましたか?

解決

私たちは私たちのアプリの私たちのアプリの中で正確にそれを動作させ、それはあなたがフルバージョンにアップグレードすることができる無料アプリで、キーチェーンにアップグレードインジケータを保存します。アップグレードインジケータは、選択した任意の文字列ですが、キーチェーンの目的のためにパスワードとして扱われます。これは、KSecValueuedataの値がキーチェーンで暗号化されています。このアプローチに関する素晴らしいボーナスは、ユーザーがアプリを削除してから後で再インストールした場合、キーチェーン項目がアプリとは別に保存されているため、Magicのようにすべてが再び有効になります。それは私たちがそれが価値があると決心したユーザーのデフォルトで何かを保存する上で、それはほとんど追加の作業です。

セキュリティ項目を作成する方法:

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