it-swarm.com.ru

Проверка версии приложения Google Play Store больше не работает

Для принудительного обновления я вызывал URL-адрес приложения и проверял значение тега html <softwareVersion><softwareVersion/>, но вдруг он перестал работать, тега softwareVersion на странице нет, поэтому он становится нулевым. Есть ли какой-нибудь интерфейс API Google для проверки версии приложения Google Play?.

Обновление - 

Я исследую более подробно, когда раньше звонил по URL, ответ был 200, но теперь я получаю 405

3
Anirban

Возможно, в конце марта Google изменил HTML-код Play Store.

Структура дополнительной информации также изменилась.

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

Возможно, вы использовали такой код:

    Document doc = Jsoup.connect
("https://play.google.com/store/apps/details?id=name.package.your").get();
    Elements Version = doc.select(".content");
    for (Element v : Version) {
        if (v.attr("itemprop").equals("softwareVersion")) {
            VersionMarket = v.text();
        }
    }

но после изменения Play Store ваш код вернется к нулю.

потому что "itemprop" и "sofrwareVersion" исчезли, вот так.

введите описание изображения здесь

Итак, вам нужен новый способ для анализа версии вашего приложения в ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ в Google Play Store с Jsoup.

try {
    Document doc = Jsoup
            .connect(
                    "https://play.google.com/store/apps/details?id=name.package.your")
            .get();

    Elements Version = doc.select(".htlgb ");

    for (int i = 0; i < 5 ; i++) {
        VersionMarket = Version.get(i).text();
        if (Pattern.matches("^[0-9]{1}.[0-9]{1}.[0-9]{1}$", VersionMarket)) {
            break;    
        }
    }

Приведенный выше код работает следующим образом.

  1. Парсинг Play Store на вашей странице приложения.
  2. Выбор всего содержимого "htlgb".

    • как на изображении, «3 марта 2018 года», «1000+», «2.0.4», «4.4 и выше и т. д.»
  3. В [для цикла] [Regex] находит значение, соответствующее вашему шаблону версии (например, 2.0.4), и останавливается.

  4. VersionMarket - это ваша «версия приложения», и вы можете использовать ее.

// 2018-08-04 Добавить комментарий

По какой-то причине приведенный выше код возвращает информацию об «Установках» вместо «информации о версии».

Поэтому, если вы измените код, как показано ниже, вы можете снова вернуть «информацию о версии».

try {
    Document doc = Jsoup
            .connect(
                    "https://play.google.com/store/apps/details?id=name.package.your")
            .get();

    Elements Version = doc.select(".htlgb ");

    for (int i = 0; i < 10 ; i++) {
        VersionMarket = Version.get(i).text();
        if (Pattern.matches("^[0-9]{1}.[0-9]{1}.[0-9]{1}$", VersionMarket)) {
            break;    
        }
    }

Приведенный выше код изменил число в «для перерыва» с 5 на 10.

Потому что количество кодов «htlgb» изменилось в HTML-коде Google Play Store.

2
KM. LEE

Я придумаю решение. Когда я нажимаю на новую версию в PlayStore, я добавляю версию в то, что нового, как это - 

ЧТО НОВОГО

Version - 2.11.0
- New changes 1
- New changes 2

И я ищу это Версия -  

Так что полный код выглядит так - 

class VersionCheckTask extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... urls) {
        String mVer = "";
        String mData = "";

        try {
            URL mUrl = new URL(urls[0]);
            BufferedReader in = new BufferedReader(new InputStreamReader(mUrl.openStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null){
                if (inputLine == null)
                    break;
                mData += inputLine;
            }
            in.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }

        /*
        * we are looking for this tag <div itemprop="description"><content>Version - 2.11.0<br>
        * We need to make sure every time we release a new version we should add the line in what's new -
        *
        * Version - 2.11.1
        *
        * - New changes 1
        * - New changes 2
        */
        String startToken = "Version - ";
        String endToken = "<";
        int index = mData.indexOf(startToken);

        if (index == -1) {
            mVer = null;

        } else {
            mVer = mData.substring(index + startToken.length(), index
                    + startToken.length() + 100);
            mVer = mVer.substring(0, mVer.indexOf(endToken)).trim();
        }
        return mVer;
    }

    protected void onPostExecute(String store_version) {
        String currentVersion = "";
        try {
            PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
            currentVersion = pInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            Log.v(TAG, "Recv NameNotFoundException. Msg:" + e.getMessage());
        }

        Log.d(TAG, "store_version: " + store_version);
        Log.d(TAG, "device_version: " + currentVersion);

        if (store_version != null) {
            if (versionCompare(store_version, currentVersion) > 0) {
                dialog.setMessage(String.format(getResources().getString(R.string.update_message), getResources().getString(R.string.app_name), store_version));
                dialog.show();
            } else {
                showDisclaimer();
            }
        }
    }
}

public int versionCompare(String storeVersion, String currentVersion) {
    String[] vals1 = storeVersion.split("\\.");
    String[] vals2 = currentVersion.split("\\.");
    int i = 0;
    // set index to first non-equal ordinal or length of shortest version string
    while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) {
        i++;
    }
    // compare first non-equal ordinal number
    if (i < vals1.length && i < vals2.length) {
        int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
        return Integer.signum(diff);
    }
    // the strings are equal or one string is a substring of the other
    // e.g. "1.2.3" = "1.2.3" or "1.2.3" < "1.2.3.4"
    return Integer.signum(vals1.length - vals2.length);
}
2
Anirban

Нет, API не существует для проверки версии вашего приложения в Play. Вместо этого вы можете реализовать решение, используя Firebase Remote Config , тогда у вас будет гораздо больше контроля над минимальной версией, которую видят ваши пользователи.

0
Nick Fortescue