Google Play商店应用程序版本检查不再起作用

3
我曾经调用应用程序的url并检查html标签值<softwareVersion><softwareVersion/>来进行强制更新,但突然间它停止工作了,网页中没有softwareVersion标签,所以返回null。是否有任何谷歌API可用来检查谷歌播放应用程序版本。
更新 - 我进一步调查时发现当我使用调用url时,响应是200,但现在我得到的是405。
3个回答

2

我想到了一个解决方案。每当我在Play商店推出新版本时,我会在“新功能”中添加版本号,就像这样 -

新功能


注:保留html标签。
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

可能在3月底,谷歌改变了Play商店的HTML代码。

附加信息的结构也已经改变。

包括我在内的一些开发者,使用Jsoup来检查Play商店的最新版本。

也许你使用的是像这样的代码:

    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();
        }
    }

但是,谷歌应用商店的更改后,您的代码返回了null。

因为,"itemprop"和"sofrwareVersion"已经消失了,就像这样。

在此输入图像描述

因此,您需要使用Jsoup在Google Play Store的“附加信息”中解析应用程序版本的新方法。

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”内容。 - 如图所示,“2018年3月3日”,“1,000+”,“2.0.4”,“4.4及更高版本”等。 3.在[for Loop]中,[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;    
        }
    }

以上代码将“for break”中的数字从5更改为10。

这是因为Google Play商店的HTML代码中“htlgb”代码的数量已更改。


分析得很好,但如果Google在未来更改类名,解决方案将会失效。建议研究其他回答中提到的“Firebase Remote Config”服务。 - Ilya

0

没有现成的 API 可以在 Play 上检查你的应用程序版本。相反,你可以使用Firebase 远程配置实现一个解决方案,这样你就可以更好地控制用户所见的最低版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接