53 votes

Comment puis-je utiliser la version payante de mon application comme "clé" de la version gratuite ?

Disons par exemple que j'ai une application Android qui fait X. La version gratuite contient des publicités ou des fonctionnalités de base. Je veux avoir une version payante qui supprime les publicités et ajoute des fonctionnalités supplémentaires.

Comment puis-je utiliser l'application payante comme "clé de licence" pour débloquer les fonctionnalités de l'application gratuite ?

Ainsi, l'utilisateur installerait l'application gratuite, puis l'application payante pour obtenir les fonctionnalités supplémentaires, mais il continuerait à utiliser l'application gratuite (qui serait maintenant déverrouillée). Quelle est la meilleure approche pour faire cela ?

37voto

Fedor Points 29890

Utilisez PackageManager pour vous assurer que votre paquet payant est installé. ET assurez-vous que la signature de votre paquet gratuit correspond à celle du paquet payant installé. Sinon, quelqu'un pourrait installer une application non signée dont le nom de paquet correspond à celui de votre paquet payant et déverrouiller le paquet premium de cette façon.

Ce post peut vous aider à trouver votre signature http://stackoverflow.com/questions/986627/detect-if-app-was-downloaded-from-Android-market/991120#991120

20voto

Destil Points 3673

J'utilise ceci :

PackageManager manager = getPackageManager();
if (manager.checkSignatures("core.package.name", "key.package.name")
    == PackageManager.SIGNATURE_MATCH) {
    //full version
}

C'est assez simple et ça marche.

8voto

David Points 1261

Voici une fonction simple qui vérifie la présence de la clé Pro, et qui vérifie que la signature du paquet correspond à la version gratuite :

protected static boolean isProInstalled(Context context) {
    PackageManager manager = context.getPackageManager();
    if (manager.checkSignatures(context.getPackageName(), "com.your.pro.key")
        == PackageManager.SIGNATURE_MATCH) {
        //Pro key installed, and signatures match
        return true;
    }
    return false;
}

Le code provient de ce message du forum sur la base de la méthode décrite à l'adresse yoki.org .

7voto

thom_nic Points 1212

Comme quelqu'un d'autre l'a souligné, vous pouvez utiliser PackageManager pour détecter la présence de l'application "clé" payante, mais cela pose un problème si quelqu'un installe uniquement la version payante, désinstalle la version gratuite, etc. Les utilisateurs pourraient être ennuyés de devoir conserver deux téléchargements pour faire fonctionner votre seule application. Pour info, je pense que DoubleTwist Air Sync le fait de cette façon. Je suis presque sûr que l'application Air Sync ne fait rien d'autre que d'activer la fonctionnalité de l'application gratuite DoubleTwist.

Une solution plus pratique serait d'avoir deux applications distinctes, puis de donner la possibilité d'importer les préférences et les données de l'une à l'autre en utilisant un fichier de configuration de l'application. ContentProvider et/ou sharedUserId . Vous pouvez alors partager la plupart de votre code utiliser un projet de bibliothèque partagée . Cependant Cela signifie que les deux applications doivent utiliser un URI de contenu différent puisque deux applications ne peuvent pas utiliser la même autorité, ce qui est assez pénible, car le code de votre bibliothèque partagée ne peut pas simplement avoir un champ CONTENT_URI ou AUTHORITY statique comme vous le trouveriez normalement dans une implémentation ContentProvider.

Je commence à penser que deux applications distinctes avec deux bases de code plus ou moins distinctes est la voie à suivre, car copier du code entre deux projets pourrait en fait être plus facile que d'essayer de maintenir une bibliothèque partagée avec toutes sortes de commutateurs pour activer ou désactiver des fonctionnalités entre une version gratuite et une version payante.

En fait, la recommandation d'edgman d'utiliser une seule application et l'utilisation des licences est probablement le meilleur manière de gérer une version gratuite et payante d'une application. Il résout tous les problèmes énumérés ci-dessus, même si, pour être honnête, je n'ai pas encore utilisé de licence moi-même.

EDIT Il semble que l'octroi de licences ne soit autorisé que pour les applications payantes (c'est dommage), ce qui est impossible si vous souhaitez proposer une version gratuite. Toutefois, facturation en ligne pourrait être la "bonne" façon pour vous de gérer une version gratuite ou payante. Peut-être que cela convient à l'OP, mais je n'ai pas l'impression d'avoir besoin d'une version gratuite. deux L'idéal serait que les applications soient toujours installées sur l'appareil de l'utilisateur. Si un utilisateur payant installe l'application sur un nouvel appareil, il semble possible de télécharger les transactions antérieures afin qu'il n'ait pas à payer deux fois.

3voto

Joubarc Points 718

Si les deux applications proviennent du même développeur et sont signées par la même clé, elles devraient être en mesure de partager des informations de manière privée. Vous pourriez probablement utiliser un fichier (stocké avec MODE_PRIVATE) mais je pense que le plus simple est d'utiliser SharedPreferences - définir un drapeau dans l'application payante qui sera lu par l'application gratuite. Voir http://developer.Android.com/guide/topics/data/data-storage.html . Je ne sais pas s'il serait facile de le contourner, surtout sur les appareils enracinés...

Un autre moyen serait de vérifier si l'application payante est installée, par exemple en vérifiant si elle accepte une intention spécifique. Voir aussi : http://developer.Android.com/resources/articles/can-i-use-this-intent.html ; dans cet exemple, ils vérifient si le scanner de codes-barres de ZXing est disponible de cette manière.

Quoi qu'il en soit, une autre variante de l'idée serait que vous puissiez "activer" plusieurs applications avec une seule payante, si vous le souhaitez. Votre application payante serait un simple "support this developer" qui supprimerait les publicités de toutes vos applications. C'est un modèle de paiement intéressant, selon moi.

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