42 votes

Stockage des reçus d'achat dans l'application dans le trousseau d'applications

Je n'ai jamais mis en œuvre En Application de l'Achat avant, j'ai donc utilisé le MKStoreKit wrapper et un travail de mise en œuvre. MKStoreKit conserve toutes les recettes dans le UserDefaults .plist comme un BOOLÉEN, donc il est très simple pour les pirates pour distribuer les achats in-app dans un "craquage" de l'état. Une fois le premier achat est fait, le faisceau peut être distribué et le .plist peut être recréé pour permettre PEI déverrouille.

Je voudrais étendre MKStoreKit pour créer de l'Achat In-App de validation des données dans l'iOS trousseau de clés. Est-il un inconvénient ou des raisons possibles de cet échec pour payer les utilisateurs, peut-être peu fiables, ou pour toute autre raison pourquoi il serait globalement une mauvaise idée de faire cela? Je comprends que le piratage est inévitable, et je certainement ne veux pas aliéner les utilisateurs payants, mais j'ai l'impression que le UserDefaults .plist est trop d'un moyen facile de les contourner.

Dans mon scénario, une chaîne simple serait de mettre dans le trousseau lorsque l'achat est effectué. De cette façon, si le binaire est distribué, à débloquer ne sont pas déjà activée. Bien sûr, il serait possible de mettre en place une solution de contournement, mais il faudrait un peu plus d'effort et de savoir comment trouver le VRAI/FAUX drapeau et de la cause qu'il retourne toujours la valeur correcte. Par le biais de l'obfuscation je pourrais même en faire un peu plus difficile à suivre que vers le bas.

Merci pour toutes vos idées et je vous remercie des réponses en évitant l'obligation inévitable de la piraterie, de traiter avec elle des réponses. Je suis plus intéressé par la technique, la viabilité de cette solution.

54voto

Jeff Argast Points 1041

Nous faisons exactement ce que dans nos de nos applications et il fonctionne très bien.C'est une application gratuite que vous pouvez mettre à niveau vers une version complète et nous stockons la mise à niveau de l'indicateur dans le trousseau d'accès. La mise à niveau de l'indicateur est une chaîne de caractères arbitraire que vous choisissez, mais pour les besoins du trousseau, il est traité comme un mot de passe, c'est à dire la valeur de kSecValueData est chiffré dans le trousseau d'accès. Un joli bonus à propos de cette approche est que si l'utilisateur supprime l'application et puis plus tard, re-installe, tout est ré-activé comme par magie parce que le trousseau éléments sont stockés séparément, à partir de l'app. Et c'est si peu de travail supplémentaire sur le stockage de quelque chose à l'utilisateur par défaut que nous avons décidé qu'il valait le coup.

Voici comment créer l'élément de sécurité:

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);

Voici comment trouver l'élément de sécurité pour vérifier sa valeur:

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
    }
}

Si upgradeItemData est nul, alors la clé n'existe pas, donc on peut penser que la mise à niveau n'est pas là ou, ce que nous faisons, est mis en valeur ce qui signifie pas de mise à niveau.

Mise à jour

Ajouté kSecReturnData (Merci @Luis pour la pointer out)

Code sur GitHub ARC (variante)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X