109 votes

Création d'une application d'essai Android qui expire après une période de temps fixe

J'ai une application que je veux mettre sur le marché en tant qu'application payante. J'aimerais avoir une autre version qui serait une version "d'essai" avec une limite de temps de, disons, 5 jours?

Comment puis-je procéder?

0 votes

Google devrait vraiment soutenir cela dans les Services Google Play!

0 votes

@powder366 en fait, Google prend en charge cela, voir developer.android.com/google/play/billing/…

190voto

snctln Points 8687

Actuellement, la plupart des développeurs accomplissent cela en utilisant l'une des 3 techniques suivantes.

La première approche est facilement contournable, la première fois que vous exécutez l'application, enregistrez la date/heure dans un fichier, une base de données ou des préférences partagées et à chaque fois que vous exécutez l'application par la suite, vérifiez si la période d'essai est terminée. C'est facile à contourner car désinstaller et réinstaller permet à l'utilisateur d'avoir une autre période d'essai.

La deuxième approche est plus difficile à contourner, mais reste contournable. Utilisez une bombe à retardement codée en dur. Fondamentalement, avec cette approche, vous coderez en dur une date de fin pour l'essai, et tous les utilisateurs qui téléchargent et utilisent l'application cesseront de pouvoir l'utiliser simultanément. J'ai utilisé cette approche car elle est facile à mettre en œuvre et pour la plupart je n'avais tout simplement pas envie de passer par les tracas de la troisième technique. Les utilisateurs peuvent contourner cela en changeant manuellement la date sur leur téléphone, mais la plupart des utilisateurs ne prendront pas la peine de le faire.

La troisième technique est la seule façon dont j'ai entendu parler pour vraiment accomplir ce que vous voulez faire. Vous devrez mettre en place un serveur, et ensuite chaque fois que votre application est lancée, votre application envoie l' [identifiant unique du téléphone](http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId()) au serveur. Si le serveur ne possède pas d'entrée pour cet identifiant de téléphone, il en crée une nouvelle et enregistre l'heure. Si le serveur a une entrée pour l'identifiant du téléphone, il effectue simplement une vérification pour voir si la période d'essai est expirée. Il communique ensuite les résultats de la vérification d'expiration de l'essai à votre application. Cette approche ne devrait pas être contournable, mais nécessite la mise en place d'un serveur web, etc.

Il est toujours recommandé de faire ces vérifications dans le onCreate. Si la période d'expiration est terminée, affichez une AlertDialog avec un lien vers le marché vers la version complète de l'application. Incluez uniquement un bouton "OK", et une fois que l'utilisateur clique sur "OK", faites un appel à "finish()" pour mettre fin à l'activité.

2 votes

Réponse fantastique. Comme vous le dites, je pense que la deuxième option est peut-être la meilleure. C'est dommage que Google lui-même ne propose pas un système de licence, car cela pourrait encourager les petits et les grands développeurs de marque à produire encore plus d'applications Android.

0 votes

Avez-vous besoin de configurer votre propre serveur? Il semble que ce soit le genre de service que quelqu'un d'autre posséderait. Cette page Web : nrc-cnrc.gc.ca/eng/services/inms/time-services/… semble indiquer qu'ils ont un service que vous pourriez utiliser.

8 votes

Aussi, je ne vérifierais pas pendant le démarrage. Votre objectif est de vendre l'application, pas de punir l'utilisateur (c'est juste un bonus ;) Si vous le configurez pour vérifier toutes les 2 minutes en cours d'exécution, vous permettez à l'utilisateur de commencer à faire quelque chose et de réaliser ensuite qu'il devrait payer. Si vous facilitez vraiment le paiement et le retour au travail (je ne suis pas sûr que vous puissiez le faire sur Android), je pense que vous vendrez plus que si vous vérifiez pendant onCreate.

18voto

Caner Points 15625

C'est une vieille question mais de toute façon, cela pourrait aider quelqu'un.

Si vous souhaitez opter pour l'approche la plus simpliste (qui échouera si l'application est désinstallée/réinstallée ou si l'utilisateur modifie manuellement la date de son appareil), voici comment cela pourrait être :

private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
private final long ONE_DAY = 24 * 60 * 60 * 1000;

@Override
protected void onCreate(Bundle state){
    SharedPreferences preferences = getPreferences(MODE_PRIVATE);
    String installDate = preferences.getString("InstallDate", null);
    if(installDate == null) {
        // Première exécution, enregistrer la date actuelle
        SharedPreferences.Editor editor = preferences.edit();
        Date now = new Date();
        String dateString = formatter.format(now);
        editor.putString("InstallDate", dateString);
        // Enregistrer les modifications !
        editor.commit();
    }
    else {
        // Ce n'est pas la première exécution, vérifier la date d'installation
        Date before = (Date)formatter.parse(installDate);
        Date now = new Date();
        long diff = now.getTime() - before.getTime();
        long days = diff / ONE_DAY;
        if(days > 30) { // Plus de 30 jours ?
             // Expiré !!!
        }
    }

    ...
}

0 votes

Eh bien en fait, si vous utilisez SharedPreferences et Android 2.2 Froyo ou version ultérieure, dès que vous implémentez les API de sauvegarde des données pour la synchronisation des données Google, l'utilisateur ne devrait pas pouvoir échapper à cela sur différents appareils ou en désinstallant, seulement en allant dans Paramètres > Applications et en effaçant les données. De plus, la méthode sur Date est getTime et non pas getTimeInMillis.

0 votes

Désaccord, cela échouera également si l'utilisateur modifie manuellement la date de l'appareil et aussi que se passe-t-il si l'utilisateur efface manuellement les données ?

0 votes

@Caner il est bon de vérifier avec sharedprefrence, mais si l'utilisateur efface la mémoire à partir des paramètres->gestionnaire d'applications et la réutilise, que faire ?

10voto

Martin Christmann Points 1098

Cette question et la réponse de snctln m'ont inspiré à travailler sur une solution basée sur la méthode 3 pour mon mémoire de licence. Je sais que l'état actuel n'est pas destiné à un usage productif mais j'aimerais savoir ce que vous en pensez! Utiliseriez-vous un tel système? Aimeriez-vous le voir comme un service cloud (sans avoir de problème avec la configuration d'un serveur)? Craignez-vous des problèmes de sécurité ou de stabilité?

Dès que j'aurai terminé la procédure de licence, je souhaite continuer à travailler sur le logiciel. C'est maintenant le moment où j'ai besoin de vos retours!

Le code source est hébergé sur GitHub https://github.com/MaChristmann/mobile-trial

Quelques informations sur le système : - Le système a trois parties, une bibliothèque Android, un serveur node.js et un configurateur pour gérer plusieurs applications d'essai ainsi que des comptes éditeur/développeur.

  • Il prend en charge uniquement les essais basés sur le temps et utilise votre compte (Play Store ou autre) plutôt qu'un ID de téléphone.

  • Pour la bibliothèque Android, elle est basée sur la bibliothèque de vérification de licence Google Play. Je l'ai modifiée pour se connecter au serveur node.js et en plus la bibliothèque essaie de reconnaître si un utilisateur a changé la date du système. Elle met également en cache une licence d'essai récupérée dans les préférences partagées cryptées AES. Vous pouvez configurer la durée de validité du cache avec le configurateur. Si un utilisateur "efface les données", la bibliothèque forcera une vérification côté serveur.

  • Le serveur utilise https et signe également numériquement la réponse de vérification de licence. Il possède également une API pour CRÉER, LIRE, METTRE À JOUR et SUPPRIMER des applications d'essai et des utilisateurs (éditeur et développeur). De la même manière que la bibliothèque de vérification de licence, les développeurs peuvent tester leur implémentation comportementale dans l'application d'essai avec un résultat de test. Ainsi, dans le configurateur, vous pouvez définir explicitement votre réponse de licence à "licenciée", "non licenciée" ou "erreur serveur".

  • Si vous mettez à jour votre application avec une nouvelle fonctionnalité géniale, vous voudrez peut-être que tout le monde puisse l'essayer à nouveau. Dans le configurateur, vous pouvez renouveler la licence d'essai pour les utilisateurs dont les licences ont expiré en définissant un code de version qui devrait déclencher cela. Par exemple, si un utilisateur exécute votre application sur le code de version 3 et que vous souhaitez qu'il essaie les fonctionnalités du code de version 4. S'il met à jour l'application ou la réinstalle, il peut à nouveau utiliser la période d'essai complète car le serveur sait sur quelle version il l'a essayée la dernière fois.

  • Tout est sous la licence Apache 2.0

2 votes

Vous venez de sauver ma journée, merci pour le travail acharné. J'ai juste pensé à écrire la même solution en utilisant une configuration chiffrée obtenue une seule fois et en conservant la clé publique dans l'application. Le seul problème majeur que je peux voir est comment accorder une licence? Vous pourriez encore avoir besoin d'un identifiant unique à transporter avec un téléphone pour éviter les accords multiples.

6voto

user2607942 Points 59

La manière la plus facile et meilleure de faire cela est de mettre en œuvre BackupSharedPreferences.

Les préférences sont préservées, même si l'application est désinstallée et réinstallée.

Sauvegardez simplement la date d'installation en tant que préférence et vous êtes prêt à partir.

Voici la théorie : http://developer.android.com/reference/android/app/backup/SharedPreferencesBackupHelper.html

Voici l'exemple : Android SharedPreferences Backup Not Working

3 votes

L'utilisateur peut désactiver la sauvegarde dans les paramètres du système.

0 votes

Et cela fonctionne uniquement à travers les ré-installations, sans effacer le stockage de l'application.

3voto

vins Points 1194

Maintenant, dans la version récente d'Android, un abonnement d'essai gratuit a été ajouté, vous pouvez débloquer toutes les fonctionnalités de votre application uniquement après avoir acheté l'abonnement dans l'application pour une période d'essai gratuite. Cela permettra à l'utilisateur d'utiliser votre application pendant une période d'essai, si l'application est toujours désinstallée après la période d'essai, l'argent de l'abonnement sera transféré à vous. Je n'ai pas essayé, mais je partage juste une idée.

Voici la documentation

3 votes

Je souhaite que cela fonctionne pour les achats uniques. Cela fonctionne uniquement pour les abonnements, qui peuvent être annuels ou mensuels.

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