157 votes

Forcer la mise à jour d'une application Android lorsqu'une nouvelle version est disponible

J'ai une application dans le Google Play Store. Lorsqu'une nouvelle version est disponible, l'ancienne version deviendra inutilisable - c'est-à-dire que si les utilisateurs ne mettent pas à jour l'application, ils ne peuvent pas entrer dans l'application. Comment puis-je forcer les utilisateurs à mettre à jour l'application lorsqu'une nouvelle version est disponible?

134voto

Michael Points 822

Je suis d'accord avec le point de Scott Helme dans une autre réponse ici. Mais dans certaines situations extrêmes (problèmes de sécurité, changements de rupture d'API...) où vous avez absolument besoin que les utilisateurs mettent à jour pour continuer à utiliser l'application, vous pourriez fournir une API de versionnement simple. L'API ressemblerait à ceci :

API de vérification de version :

Paramètres de requête :

  • int appVersion

Réponse

  1. boolean forceUpgrade
  2. boolean recommendUpgrade

Lorsque votre application démarre, vous pourriez appeler cette API qui transmet la version actuelle de l'application, et vérifier la réponse de l'appel à l'API de versionnement.

Si forceUpgrade est true, affichez une boîte de dialogue contextuelle avec des options pour permettre à l'utilisateur de quitter l'application, ou d'aller sur Google Play Store pour mettre à jour l'application.

Sinon si recommendUpgrade est true, affichez la boîte de dialogue contextuelle avec des options pour mettre à jour ou continuer à utiliser l'application.

Même avec cette capacité de mise à jour forcée en place, vous devriez continuer à prendre en charge les anciennes versions, sauf si absolument nécessaire.

61voto

user3315298 Points 21

Essayez ceci : Tout d'abord, vous devez faire un appel de requête vers le lien du Play Store, récupérer la version actuelle à partir de là, puis la comparer avec votre version actuelle.

Chaîne currentVersion, latestVersion;
Dialog dialogue;
private void getCurrentVersion(){
 PackageManager pm = this.getPackageManager();
        PackageInfo pInfo = null;

        try {
            pInfo =  pm.getPackageInfo(this.getPackageName(),0);

        } catch (PackageManager.NameNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        currentVersion = pInfo.versionName;

   new GetLatestVersion().execute();

}

private class GetLatestVersion extends AsyncTask {

        private ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected JSONObject doInBackground(String... params) {
            try {
//Il récupère la dernière version en analysant le contenu de la version actuelle du Play Store au moment de l'exécution
                Document doc = Jsoup.connect(urlOfAppFromPlayStore).get();
                latestVersion = doc.getElementsByClass("htlgb").get(6).text();

            }catch (Exception e){
                e.printStackTrace();

            }

            return new JSONObject();
        }

        @Override
        protected void onPostExecute(JSONObject jsonObject) {
            if(latestVersion!=null) {
                if (!currentVersion.equalsIgnoreCase(latestVersion)){
                   if(!isFinishing()){ //Cela aiderait à éviter l'erreur : BinderProxy@45d459c0 n'est pas valide ; votre activité est-elle en cours d'exécution ?
                    showUpdateDialog();
                    }
                }
            }
            else
                background.start();
            super.onPostExecute(jsonObject);
        }
    }

private void showUpdateDialog(){
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Une nouvelle mise à jour est disponible");
        builder.setPositiveButton("Mettre à jour", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse
                        ("market://details?id=yourAppPackageName")));
                dialog.dismiss();
            }
        });

        builder.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                background.start();
            }
        });

        builder.setCancelable(false);
        dialog = builder.show();
    }

56voto

Scott Helme Points 2477

Vous ne devriez pas cesser de prendre en charge une ancienne version dès qu'une nouvelle version sort. Cela entraînera une expérience utilisateur terrible. Je ne connais aucun éditeur de logiciels qui fait cela, pour une bonne raison.

Que se passe-t-il si l'utilisateur ne peut pas mettre à jour ou ne veut pas le faire à ce moment-là ? Il ne pourra tout simplement pas utiliser votre application, ce qui est mauvais.

Google ne fournit aucune option de suivi des versions de cette manière, vous devriez donc le faire vous-même. Un simple service web pour retourner la version en direct actuelle que votre application peut vérifier serait suffisant. Vous pouvez ensuite mettre à jour la version et l'application saura qu'elle est obsolète. Je recommanderais seulement d'utiliser cela pour informer vos utilisateurs d'une mise à jour plus rapidement que de dépendre de Google Play. Cela ne devrait pas vraiment être utilisé pour empêcher l'application de fonctionner, juste pour inciter l'utilisateur à mettre à jour.

39voto

Gaket Points 1964

Solution de l'équipe Google

À partir d'Android 5.0, il est désormais possible grâce au nouveau mécanisme de mises à jour In-App de Google Play. Les exigences sont d'avoir la bibliothèque Play Core d'une version 1.5.0 ou supérieure et d'utiliser la distribution de bundles d'applications au lieu des APK.

La bibliothèque vous propose 2 manières différentes d'informer les utilisateurs de la mise à jour :

  1. Flexible, où les utilisateurs peuvent continuer à utiliser l'application pendant qu'elle est mise à jour en arrière-plan.

  2. Immédiat - écran bloquant qui empêche l'utilisateur d'entrer dans l'application tant qu'il ne l'a pas mise à jour.

Voici les étapes suivantes pour le mettre en œuvre :

  1. Vérifier la disponibilité de la mise à jour
  2. Démarrer la mise à jour
  3. Recevoir un retour sur l'état de la mise à jour
  4. Gérer la mise à jour

Toutes ces étapes sont décrites en détail sur le site officiel : https://developer.android.com/guide/app-bundle/in-app-updates

33voto

Kirill Karmazin Points 959

Google a introduit la librairie In-app updates, (https://developer.android.com/guide/app-bundle/in-app-updates) Elle fonctionne sur Lollipop+ et vous permet de demander à l'utilisateur une mise à jour avec une boîte de dialogue agréable (FLEXIBLE) ou avec un message plein écran obligatoire (IMMEDIATE).

Vous devez mettre en œuvre cette dernière. Voici à quoi cela ressemblera : enter image description here

J'ai couvert tout le code dans cette réponse : https://stackoverflow.com/a/56808529/5502121

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