如何以编程方式获取应用线上最新版本?附官方解决方案
问题
此前我一直通过如下Jsoup爬取代码,编程获取Google Play上的应用线上版本号:
try { newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + appPackageName + "&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(".hAyfc .htlgb") .get(7) .ownText(); } catch (IOException e) { e.printStackTrace(); }
从2022年5月末开始,这段代码持续抛出异常,无法正常获取版本信息。想确认是否有其他开发者遇到相同问题,求可行的修复方案。
解决方案
爬取Play商店网页的方案本身就不受官方保障,只要Google调整前端页面结构、元素类名,原有选择器就会直接失效。目前Google已经为应用版本检测、应用内更新场景提供了官方支持,直接使用官方提供的AppUpdateManager即可稳定实现相关需求。
核心实现依赖 AppUpdateManager 类,属于Google Play Core库提供的官方能力。
检查更新可用性
发起更新流程前首先需要检测是否存在可用更新,基础实现代码如下:
// 初始化更新管理器实例 AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(context); // 获取用于检查更新的任务对象 Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo(); // 校验当前平台是否允许指定类型的更新 appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> { if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE // 若需使用灵活更新类型,请替换为AppUpdateType.FLEXIBLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { // 此处发起更新请求 } });
接口返回的
AppUpdateInfo对象包含完整的更新状态信息:
- 若存在可用更新,且你配置的更新类型(立即更新/灵活更新)被允许,对象中会携带启动更新流程所需的intent,可直接调用启动更新
- 若当前已有正在进行中的应用内更新,返回结果也会同步上报该更新的进度状态
该方案经多场景实测稳定可用,不会因为Play商店前端页面结构调整失效,推荐所有有版本检测需求的开发者替换使用。
内容的提问来源于stack exchange,提问作者AmigoPal
相关产品推荐
相关产品推荐

