Проверка версий с Jsoup больше не работает

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

private boolean checkVersionNumber() {
            boolean isCurrentVersion = true;
            DebugLog.d(TAG + "https://play.google.com/store/apps/details?id = " + getPackageName());

            VersionChecker versionChecker = new VersionChecker();

            try {
                String latestVersion = versionChecker.execute().get();
                PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
                String currentVersion = pInfo.versionName;

                if (!TextUtils.isEmpty(latestVersion) && !TextUtils.isEmpty(currentVersion)) {
                    DebugLog.d(TAG + "checkVersionNumber: VERSIONS NOT EMPTY");
                    if (latestVersion.equalsIgnoreCase(currentVersion)) {
                        DebugLog.d(TAG + "checkVersionNumber: IS THE CURRENT VERSION");
                        isCurrentVersion = true;
                    } else {
                        DebugLog.d(TAG + "checkVersionNumber: IS THE CURRENT VERSION");
                        isCurrentVersion = false;
                    }
                } else {
                    DebugLog.d(TAG + "checkVersionNumber: VERSIONS WERE EMPTY");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }

            return isCurrentVersion;

        }

Ниже приведен код для VersionChecker

public 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 = " + getPackageName())
                        .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;
        }
    }

Пока все работало нормально. Но за последний месяц все пользователи становятся ниже нормы.

java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                             at android.os.AsyncTask$3.done(AsyncTask.java:325)
                                                                             at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                             at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                             at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                             at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
                                                                             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                             at java.lang.Thread.run(Thread.java:761)
                                                                          Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.jsoup.nodes.Element.ownText()' on a null object reference
                                                                             at com.myapp.activity.SplashActivity$VersionChecker.doInBackground(SplashActivity.java:190)
                                                                             at com.myapp.activity.SplashActivity$VersionChecker.doInBackground(SplashActivity.java:176)
                                                                             at android.os.AsyncTask$2.call(AsyncTask.java:305)
                                                                             at java.util.concurrent.FutureTask.run(FutureTask.java:237)

Я не уверен, что не так. Кто-нибудь знает, работает этот api или больше нет .. ???

Тот факт, что вы получаете исключение нулевой ссылки, означает, что на странице нет такого элемента, как div[itemprop=softwareVersion]; возможно, HTML изменился с тех пор, как вы его создали. Как выглядит html, когда вы получаете URL-адрес?

Developer Guy 11.04.2018 14:22

@Justin Как мне получить правильный HTML .. ??

Nir Patel 11.04.2018 15:57

Jsoup.connect("https://play.google.com/store/apps/details?id‌​ = " + getPackageName()).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() будет HTML, который вы разбираете. На что это похоже?

Developer Guy 12.04.2018 14:38
1
3
796
1

Ответы 1

Парсить магазин Play на наличие текущей версии - действительно плохая идея. Магазин Play может изменить свой HTML в любое время (как вы уже выяснили). Он также плохо относится к пользователям, у которых есть законная причина остаться на старой версии (например, они путешествуют и у них очень дорогой Интернет) на некоторое время.

Гораздо лучше было бы использовать что-то вроде Удаленная конфигурация Firebase для настройки минимально приемлемой версии вашего приложения. Обновите его до последней версии через некоторое время (может быть, через неделю или две) после того, как вы выпустили обновление приложения. Сюда:

  • у вас есть полный контроль над процессом
  • Изменения HTML в Play Маркете не вызывают сбоев
  • вы даете пользователям возможность контролировать, когда они обновляются, когда им удобно

Другие вопросы по теме