Подтвердить что ты не робот

Принудительное обновление приложения Android, когда доступна новая версия

У меня есть приложение в магазине Google Play. Когда доступна версия обновления, более старая версия станет непригодной для использования, то есть, если пользователи не обновят приложение, они не войдут в приложение. Как я могу заставить пользователей обновлять приложение, когда новая версия становится доступной?

4b9b3361

Ответ 1

Я согласен с точкой Скотта Хельме выше. Но в некоторых экстремальных ситуациях (проблемы безопасности, нарушения API-интерфейсов...), где вам абсолютно необходимо, чтобы пользователи обновлялись для продолжения использования приложения, вы могли бы предоставить простой API управления версиями. API будет выглядеть так:

versionCheck API:

Параметры запроса:

  • int appVersion

Ответ

  • boolean forceUpgrade
  • boolean recommendUpgrade

Когда начнется ваше приложение, вы можете вызвать этот API, который будет передан в текущей версии приложения, и проверить ответ на вызов API управления версиями.

Если forceUpgrade - true, отобразите всплывающее диалоговое окно с параметрами, чтобы либо позволить пользователю выйти из приложения, либо перейти в Google Play Store, чтобы обновить приложение.

Иначе, если recommendUpgrade true, покажите всплывающее диалоговое окно с параметрами для обновления или продолжением использования приложения.

Даже при наличии этой принудительной возможности обновления вы должны продолжать поддерживать более старые версии, если это абсолютно необходимо.

Ответ 2

попробуйте это: сначала вам нужно сделать запрос вызова на ссылку PlayStore, получить текущую версию оттуда и затем сравнить ее с вашей текущей версией.

String currentVersion, latestVersion;
Dialog dialog;
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<String, String, JSONObject> {

        private ProgressDialog progressDialog;

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

        @Override
        protected JSONObject doInBackground(String... params) {
            try {
//It retrieves the latest version by scraping the content of current version from play store at runtime
                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()){ //This would help to prevent Error : [email protected] is not valid; is your activity running? error
                    showUpdateDialog();
                    }
                }
            }
            else
                background.start();
            super.onPostExecute(jsonObject);
        }
    }

private void showUpdateDialog(){
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("A New Update is Available");
        builder.setPositiveButton("Update", 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("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                background.start();
            }
        });

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

Ответ 3

Вы не должны останавливать поддержку старой версии, как только выйдет новая версия. Это приведет к ужасному пользователю. Я не знаю какого-либо производителя программного обеспечения, который делает это, по уважительной причине.

Что произойдет, если пользователь не сможет обновить или не хочет в это время? Они просто не могут использовать ваше приложение, что плохо.

Google не предоставляет никаких параметров для отслеживания версий, поэтому вам придется сворачивать свои собственные. Простой веб-сервис, чтобы вернуть текущую версию, которую может проверить ваше приложение, будет достаточно. Затем вы можете обновить версию, и приложение будет знать, что оно устарело. Я бы рекомендовал использовать это, чтобы ваши пользователи знали, что есть обновление быстрее, чем в зависимости от Google Play. На самом деле это не должно использоваться для предотвращения работы приложения, просто чтобы пользователь обновил его.

Ответ 4

Скотт и Майкл отвечают правильно. Укомплектовать службу, предоставляющую минимальный номер версии, которую вы поддерживаете, и сравнить ее с установленной версией. Вы, надеюсь, никогда не должны использовать это, но это спасатель жизни, если какая-то версия там, вы абсолютно должны убить из-за какого-то серьезного недостатка.

Я просто хотел добавить код для того, что делать дальше. Вот как вы затем запускаете намерение Google Play и отправляете их в свою новую версию в магазине после запроса пользователю, что они должны обновиться.

public class UpgradeActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upgrade);
        final String appName = "com.appname";
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id="+appName)));

            }
        });
    }
}

Вы должны пересмотреть свой дизайн, если вам нужно принудительно обновлять каждую версию.

Ответ 5

Решение от команды Google

Начиная с Android 5.0, этого легко достичь с помощью нового механизма обновлений Google Play In App. Требования должны иметь библиотеку Play Core версии 1.5. 0+ и использовать распределение приложений App Bundles вместо apks.

Библиотека предоставляет вам 2 различных способа уведомления пользователей об обновлении:

  1. Гибкость, когда пользователи могут продолжать использовать приложение, пока оно обновляется в фоновом режиме.

  2. Немедленно - экран блокировки, который не позволяет пользователю войти в приложение, пока они не обновят его.

Есть следующие шаги для его реализации:

  1. Проверить наличие обновлений
  2. Начать обновление
  3. Получить обратный звонок для обновления статуса
  4. Обрабатывать обновление

Все эти шаги реализации подробно описаны на официальном сайте: https://developer.android.com/guide/app-bundle/in-app-updates

Ответ 6

Я настоятельно рекомендую проверить Firebase Remote Config для этого.

Я реализовал его с помощью параметра - app_version_enabled - с условием "Disabled Android Versions", который выглядит так:

applies if App ID == com.example.myapp and App version regular expression ^(5.6.1|5.4.2) 

Значение по умолчанию для параметра "true", но Disabled Android Versions имеет значение false. В моем регулярном выражении для отключенных версий Android вы можете добавить больше отключенных версий просто с другим |{version name} внутри этих круглых скобок.

Затем я просто проверяю, разрешена ли конфигурация версией или нет. У меня есть активность, которую я запускаю, что заставляет пользователя обновляться. Я проверяю только два места, из которых приложение может быть запущено извне (моя деятельность по запуску по умолчанию и активность по обработке намерений). Поскольку Remote Config работает в кэше, он не будет сразу захватывать "отключенные" версии приложения, если требуемое время не прошло, чтобы кеш был недействительным, но это не более 12 часов, если вы идете по их рекомендуемое значение срока действия кеша.

Ответ 7

Официально Google предоставляет Android API для этого.

В настоящее время API тестируется с несколькими партнерами и скоро станет доступным для всех разработчиков.

Ответ 8

Лучше определить наш собственный процесс для обновления.

  • Создайте веб-сервис, который предоставляет последнюю версию приложения (ios, android) с нашего сервера.
  • Или любой веб-сервис, который вы использовали в приложении (например, Login), вернет последнюю версию приложения с сервера.
  • После того, как приложение получит версию С# 1 или 2. Приложение перекроет ее с помощью локальной /cuurent appversion. если есть разница, мы можем показать предупреждение следующим образом:

Android и iOS: Если доступна последняя версия приложения, она отобразит предупреждение как "Последняя версия, доступная с дополнительными функциями", "Обновить", нажмите кнопку "Обновить" (предупреждайте кнопку "Upgarde" и "No Thanks" ). Затем приложение будет перенаправлено на playstore/Appstore и откроет последнюю версию.

 --- we can do upgrade compulsory or optionally.

Перед обновлением убедитесь, что вы обработали надлежащий процесс миграции db, если есть изменение схемы db.

Ответ 9

проверить код версии локального и play store apk

try {
        versionChecker VersionChecker = new versionChecker();
        String versionUpdated = VersionChecker.execute().get().toString();
        Log.i("version code is", versionUpdated);


        PackageInfo packageInfo = null;
        try {
            packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        int version_code = packageInfo.versionCode;
        String version_name = packageInfo.versionName;
        Log.i("updated version code", String.valueOf(version_code) + "  " + version_name);
        if (version_name != versionUpdated) {
            String packageName = getApplicationContext().getPackageName();//
            UpdateMeeDialog updateMeeDialog = new UpdateMeeDialog();
            updateMeeDialog.showDialogAddRoute(MainActivity.this, packageName);
            Toast.makeText(getApplicationContext(), "please updated", Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        e.getStackTrace();
    }

реализовать класс для проверки версии

class versionChecker extends AsyncTask<String, String, String> {
String newVersion;

@Override
protected String doInBackground(String... params) {

    try {
        newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=+YOR_PACKAGE_NAME+&hl=en")
                .timeout(30000)
                .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                .referrer("http://www.google.com")
                .get()
                .select("div[itemprop=softwareVersion]")
                .first()
                .ownText();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return newVersion;
}
}

Диалоговое окно для обновления

public class UpdateMeeDialog {

ActivityManager am;
TextView rootName;
Context context;
Dialog dialog;
String key1,schoolId;
public void showDialogAddRoute(Activity activity, final String packageName){
    context=activity;
    dialog = new Dialog(context);

    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.dialog_update);
    am = (ActivityManager)activity.getSystemService(Context.ACTIVITY_SERVICE);

    Button cancelDialogue=(Button)dialog.findViewById(R.id.buttonUpdate);
    Log.i("package name",packageName);
    cancelDialogue.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(Intent.ACTION_VIEW);                
    intent.setData(Uri.parse("https://play.google.com/store/apps/details?
    id="+packageName+"&hl=en"));
            context.startActivity(intent);
        }
    });
    dialog.show();
}
}

Диалоговое окно

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d4e9f2">


<TextView
    android:layout_width="match_parent"
    android:layout_height="40dp"

    android:text="Please Update First..!!"
    android:textSize="20dp"
    android:textColor="#46a5df"
    android:textAlignment="center"
    android:layout_marginTop="50dp"
    android:id="@+id/textMessage"
    />
<LinearLayout
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:weightSum="1"
    android:layout_marginTop="50dp"
    android:layout_below="@+id/textMessage"
    android:layout_height="50dp">

    <Button
        android:id="@+id/buttonUpdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Update"
        android:background="#67C6F1"
        android:textAlignment="center" />
</LinearLayout>

Ответ 10

Google представил библиотеку обновлений в приложении, (https://developer.android.com/guide/app-bundle/in-app-updates), она работает на Lollipop+ и дает вам возможность попросить пользователя обновить с хороший диалог (ГИБКИЙ) или с обязательным полноэкранным сообщением (НЕМЕДЛЕННЫЙ).

Вам необходимо реализовать последнее. Вот как это будет выглядеть: enter image description here

Я покрыл весь код в этом ответе: fooobar.com/questions/124294/...

Ответ 11

Чтобы заставить пользователя приложения обновляться, если обновление доступно на рынке, вы должны сначала проверить версию приложения на рынке и сравнить его с версией приложения на устройстве. Если они отличаются, это может быть доступное обновление. В этом посте я записал код для получения текущей версии рынка и текущей версии на устройстве и сравнил их вместе. Я также показал, как показать диалог обновления и перенаправить пользователя на страницу обновления. Перейдите по этой ссылке: fooobar.com/questions/114248/... Просто убедитесь, что в диалоговом окне вы показываете только кнопку обновления пользователя и не показываете ему кнопку отмены. В этом случае он будет вынужден обновить, прежде чем он сможет использовать приложение.

Ответ 12

То, что определенно должно быть упомянуто здесь, - это скорый релиз In-app Updates API.

У вас будет два варианта с этим API; первый - это полноэкранный режим для критических обновлений, когда вы ожидаете, что пользователь будет ждать немедленного применения обновления. Второй вариант - гибкое обновление, которое означает, что пользователь может продолжать использовать приложение, пока обновление загружено. Вы можете полностью настроить процесс обновления, чтобы он выглядел как часть вашего приложения.

Ответ 13

вы можете сделать это, выполнив совпадение между номером версии, который хранится в приложении в переменной, и аналогичным образом текущая версия приложения хранится на стороне сервера, и каждый раз, когда пользователь открывает приложение, первый запрос должен быть отправлен для проверки того, что если он обнаружил совпадение, ничего не делайте, просто позволяйте пользователю использовать ваше приложение, иначе стремитесь к игровому магазину Google или откройте окно веб-просмотра для вашего приложения (window.open( " https://play.google.com/store/apps/details?id=package_name", '_system', 'location = yes');), и там у них автоматически будет кнопка с запросом обновления, что то, что для Google PlayStore делает для вас, если у вас нет автоматических обновлений.

Ответ 14

Вы можете уведомить своих пользователей о наличии новой версии текущего приложения для обновления. Кроме того, если это условие истинно, вы можете заблокировать вход в приложение.

Посмотрите, будет ли это предоставить вам решение.

Ответ 15

Что ж, может быть много решений этой проблемы, например, удаление кода версии со страницы приложения (страница приложения Google Play) и т.д.

Но я собираюсь показать вам окончательное решение, которое не будет стоить ни копейки и будет работать как по волшебству.

  1. Просто сохраните последнюю версию кода вашего приложения в Firebase Remote
    Панель настроек
  2. Получить значение кода версии при каждом запуске приложения
  3. Сравните его с текущей версией кода приложения, которую вы можете получить с помощью следующего кода

    private int getCurrentVersionCode() {
    try {
        return getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
    return -1;
    

    }

Если извлеченный код версии больше текущей версии, покажите AlertDialog с просьбой обновить приложение. В противном случае приложение уже обновлено.

Таким образом, всякий раз, когда вы выкатываете новую версию, вы должны поместить этот код новой версии в панель конфигурации Firebase Remote.

Вы можете прочитать весь учебник о том, как заставить пользователей обновлять приложение с помощью Firebase Remote Config.

Ответ 16

Рекомендуется использовать удаленную конфигурацию для версии приложения, и всегда проверяйте активность при запуске, если текущая версия приложения совпадает с удаленной версией или нет, если нет принудительного обновления для магазина приложений.

Простая логика счастливого кодирования..

https://firebase.google.com/docs/remote-config/android

Ответ 17

Вы можете использовать обновления встроенной библиотеки Play Core для решения этой проблемы. Вы можете проверить наличие обновлений и установить их, если они доступны без проблем.

Обновления в приложении не совместимы с приложениями, использующими файлы расширения APK (файлы .obb). Вы можете выбрать гибкую загрузку или немедленные обновления, которые Google Play позаботится о загрузке и установке обновления для вас.

dependencies {
    implementation 'com.google.android.play:core:1.5.0'
    ...
}

Ссылайтесь на этот ответ fooobar.com/questions/5910987/...

Ответ 18

Используйте appgrades.io Просто интегрируйте SDK, и с помощью панели инструментов вы можете легко заблокировать любую версию, настроив пользовательский вид/всплывающее окно, которое будет отображаться для ваших пользователей с просьбой обновить их.

Ответ 19

Google выпустил In-App Updates для библиотеки Play Core.

Я реализовал облегченную библиотеку, чтобы легко реализовывать обновления в приложении. Вы можете найти по следующей ссылке пример того, как заставить пользователя выполнить обновление.

https://github.com/dnKaratzas/android-inapp-update#forced-updates