Я разместил свое приложение в магазине Google Play. Его установили многие клиенты моей компании. Я понимаю, как должно обновляться приложение.
Пользователи должны установить флажок автоматического обновления в приложении playstore для каждого приложения, которое они хотят обновлять автоматически. Однако некоторые пользователи не отметили его или не отметили в первую очередь.
Приложение, которое я написал, предназначено для индустрии ухода и используется лицами, осуществляющими уход, для оказания помощи на дому. У некоторых наших клиентов 1200 опекунов. Им придется вызывать в офис всех лиц, осуществляющих уход, для индивидуального обновления телефонов. Это явно недопустимо.
Есть ли способ программно проверить, есть ли обновленная версия моего приложения в Play Store?
Могу ли я иметь код, который запускается каждый раз, когда пользователь запускает приложение, которое проверяет Play Store? Если есть обновленная версия, пользователь может быть направлен в игровой магазин. Это будет означать, что автоматическое обновление не обязательно проверять.
заранее спасибо
Мэтт
Ответы:
Обновление 17 октября 2019 г.
https://developer.android.com/guide/app-bundle/in-app-updates
Обновление 24 апреля 2019 г .:
Android анонсировал функцию, которая, вероятно, решит эту проблему. Использование API обновлений в приложении: https://android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsummit.html
Оригинал:
Насколько мне известно, официального Google API, поддерживающего это, не существует.
Вам следует подумать о том, чтобы получить номер версии из API.
Вместо подключения к внешним API или веб-страницам (например, Google Play Store). Существует риск того, что что-то может измениться в API или на веб-странице, поэтому вам следует подумать о том, чтобы проверить, не соответствует ли код версии текущего приложения номеру версии, который вы получаете из собственного API.
Просто помните, что если вы обновляете свое приложение, вам нужно изменить версию в собственном API с номером версии приложения.
Я бы порекомендовал вам создать файл на вашем собственном веб-сайте или в API с номером версии. (В конце концов, сделайте cronjob и сделайте автоматическое обновление версии и отправьте уведомление, когда что-то пойдет не так)
Вы должны получить это значение со своей страницы в Google Play Store (тем временем изменено, больше не работает):
<div class="content" itemprop="softwareVersion"> x.x.x </div>
Проверьте в своем приложении, что версия, используемая на мобильном телефоне, не ниже номера версии, указанного в вашем собственном API.
В идеале, показать указание на необходимость обновления с уведомлением.
Что ты можешь сделать
Номер версии с использованием собственного API
Плюсы:
Минусы:
Номер версии на веб-странице Google Play Store
Плюсы:
Минусы:
источник
Current Version
указан какVaries with device
любая идея, как это можно решить, или доступна ли какая-либо другая альтернатива ??Включите JSoup в файл build.gradle ваших приложений:
dependencies { compile 'org.jsoup:jsoup:1.8.3' }
и получите текущую версию, например:
currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
И выполните следующий поток:
private class GetVersionCode extends AsyncTask<Void, String, String> { @Override protected String doInBackground(Void... voids) { String newVersion = null; try { newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.this.getPackageName() + "&hl=it") .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(); return newVersion; } catch (Exception e) { return newVersion; } } @Override protected void onPostExecute(String onlineVersion) { super.onPostExecute(onlineVersion); Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion); if (onlineVersion != null && !onlineVersion.isEmpty()) { if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) { //show dialog } } }
Для получения дополнительной информации посетите: http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html.
источник
getPackageManager().getPackageInfo(getPackageName(), 0).versionName
Вы могли бы просто использоватьBuildConfig.VERSION_NAME
:)Firebase Remote Config на данный момент может быть возможным и надежным решением, поскольку Google не предоставил ему API.
Проверьте документы Firebase Remote Config
Шаги 1. Создайте проект firebase и добавьте в свой проект google_play_service.json
2. Создайте такие ключи, как «android_latest_version_code» и «android_latest_version_name» в консоли firebase-> Remote Config
3. Код Android
public void initializeFirebase() { if (FirebaseApp.getApps(mContext).isEmpty()) { FirebaseApp.initializeApp(mContext, FirebaseOptions.fromResource(mContext)); } final FirebaseRemoteConfig config = FirebaseRemoteConfig.getInstance(); FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(BuildConfig.DEBUG) .build(); config.setConfigSettings(configSettings); }
Получить название и код текущей версии
int playStoreVersionCode = FirebaseRemoteConfig.getInstance().getString( "android_latest_version_code"); PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0); int currentAppVersionCode = pInfo.versionCode; if(playStoreVersionCode>currentAppVersionCode){ //Show update popup or whatever best for you }
4. И постоянно обновляйте firebase "android_latest_version_code" и "android_latest_version_name", используя имя и код текущей производственной версии.
Удаленная конфигурация Firebase работает как на Android, так и на IPhone.
источник
Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 68703 > 65536)
. В этом случае вам следует добавить MultiDex в ваше приложение.Вы можете получить текущую версию Playstore, используя
JSoup
некоторые модификации, как показано ниже:@Override protected String doInBackground(Void... voids) { String newVersion = null; try { newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.this.getPackageName() + "&hl=it") .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(); return newVersion; } catch (Exception e) { return newVersion; } } @Override protected void onPostExecute(String onlineVersion) { super.onPostExecute(onlineVersion); Log.d("update", "playstore version " + onlineVersion); }
ответ @Tarun больше не работает.
источник
Ответ @Tarun работал отлично. Но теперь нет из-за недавних изменений от Google на веб-сайте Google Play.
Просто измените это из ответа @Tarun ..
class GetVersionCode extends AsyncTask<Void, String, String> { @Override protected String doInBackground(Void... voids) { String newVersion = null; try { Document document = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.this.getPackageName() + "&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(); if (document != null) { Elements element = document.getElementsContainingOwnText("Current Version"); for (Element ele : element) { if (ele.siblingElements() != null) { Elements sibElemets = ele.siblingElements(); for (Element sibElemet : sibElemets) { newVersion = sibElemet.text(); } } } } } catch (IOException e) { e.printStackTrace(); } return newVersion; } @Override protected void onPostExecute(String onlineVersion) { super.onPostExecute(onlineVersion); if (onlineVersion != null && !onlineVersion.isEmpty()) { if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) { //show anything } } Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion); } }
и не забудьте добавить библиотеку JSoup
dependencies { compile 'org.jsoup:jsoup:1.8.3'}
и на Oncreate ()
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String currentVersion; try { currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } new GetVersionCode().execute(); }
вот и все .. Благодаря этой ссылке
источник
Google представил API обновлений в приложении
В настоящее время API поддерживает два потока:
источник
Есть библиотека AppUpdater . Как включить:
источник
Исходя из гибридного приложения POV. Это пример javascript, у меня есть нижний колонтитул «Доступно обновление» в моем главном меню. Если доступно обновление (т. Е. Номер моей версии в файле конфигурации меньше, чем полученная версия, отобразить нижний колонтитул), это направит пользователя в магазин приложений / воспроизведения, где пользователь затем может нажать кнопку обновления.
Я также получаю новые данные (например, примечания к выпуску) и отображаю их в модальном окне при входе в систему, если это первый раз в этой версии.
На устройстве Ready укажите URL-адрес вашего магазина
if (device.platform == 'iOS') storeURL = 'https://itunes.apple.com/lookup?bundleId=BUNDLEID'; else storeURL = 'https://play.google.com/store/apps/details?id=BUNDLEID';
Метод «Доступно обновление» можно запускать сколь угодно часто. Мой запускается каждый раз, когда пользователь переходит на главный экран.
function isUpdateAvailable() { if (device.platform == 'iOS') { $.ajax(storeURL, { type: "GET", cache: false, dataType: 'json' }).done(function (data) { isUpdateAvailable_iOS(data.results[0]); }).fail(function (jqXHR, textStatus, errorThrown) { commsErrorHandler(jqXHR, textStatus, false); }); } else { $.ajax(storeURL, { type: "GET", cache: false }).done(function (data) { isUpdateAvailable_Android(data); }).fail(function (jqXHR, textStatus, errorThrown) { commsErrorHandler(jqXHR, textStatus, false); }); } }
Обратный вызов iOS: у Apple есть API, поэтому его очень легко получить
function isUpdateAvailable_iOS (data) { var storeVersion = data.version; var releaseNotes = data.releaseNotes; // Check store Version Against My App Version ('1.14.3' -> 1143) var _storeV = parseInt(storeVersion.replace(/\./g, '')); var _appV = parseInt(appVersion.substring(1).replace(/\./g, '')); $('#ft-main-menu-btn').off(); if (_storeV > _appV) { // Update Available $('#ft-main-menu-btn').text('Update Available'); $('#ft-main-menu-btn').click(function () { openStore(); }); } else { $('#ft-main-menu-btn').html(' '); // Release Notes settings.updateReleaseNotes('v' + storeVersion, releaseNotes); } }
Обратный вызов Android: PlayStore вам нужно очистить, как вы можете видеть, версию относительно легко получить, а что нового я беру html вместо текста, так как таким образом я могу использовать их форматирование (т.е. новые строки и т. Д.)
function isUpdateAvailable_Android(data) { var html = $(data); var storeVersion = html.find('div[itemprop=softwareVersion]').text().trim(); var releaseNotes = html.find('.whatsnew')[0].innerHTML; // Check store Version Against My App Version ('1.14.3' -> 1143) var _storeV = parseInt(storeVersion.replace(/\./g, '')); var _appV = parseInt(appVersion.substring(1).replace(/\./g, '')); $('#ft-main-menu-btn').off(); if (_storeV > _appV) { // Update Available $('#ft-main-menu-btn').text('Update Available'); $('#ft-main-menu-btn').click(function () { openStore(); }); } else { $('#ft-main-menu-btn').html(' '); // Release Notes settings.updateReleaseNotes('v' + storeVersion, releaseNotes); } }
Логика открытого магазина проста, но для полноты картины
function openStore() { var url = 'https://itunes.apple.com/us/app/appname/idUniqueID'; if (device.platform != 'iOS') url = 'https://play.google.com/store/apps/details?id=appid' window.open(url, '_system') }
Убедитесь, что Play Store и App Store внесены в белый список:
<access origin="https://itunes.apple.com"/> <access origin="https://play.google.com"/>
источник
Firebase Remote Config лучше.
Реализация удаленной настройки на Android
Добавление зависимости Remote Config
compile 'com.google.firebase:firebase-config:9.6.0'
После этого мы можем получить доступ к экземпляру FirebaseRemoteConfig во всем нашем приложении, где это необходимо:
Получение значений удаленной конфигурации
boolean someBoolean = firebaseRemoteConfig.getBoolean("some_boolean"); byte[] someArray = firebaseRemoteConfig.getByteArray("some_array"); double someDouble = firebaseRemoteConfig.getDouble("some_double"); long someLong = firebaseRemoteConfig.getLong("some_long"); String appVersion = firebaseRemoteConfig.getString("appVersion");
Получение значений на стороне сервера
firebaseRemoteConfig.fetch(cacheExpiration) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { mFirebaseRemoteConfig.activateFetched(); // We got our config, let's do something with it! if(appVersion < CurrentVersion){ //show update dialog } } else { // Looks like there was a problem getting the config... } } });
Теперь после загрузки новой версии в playstore нам нужно обновить номер версии внутри firebase. Теперь, если это новая версия, отобразится диалоговое окно обновления.
источник
Внутри метода OnCreate напишите ниже код ..
VersionChecker versionChecker = new VersionChecker(); try { latestVersion = versionChecker.execute().get(); Toast.makeText(getBaseContext(), latestVersion , Toast.LENGTH_SHORT).show(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }
это дает вам версию приложения для магазина воспроизведения ..
тогда вам нужно проверить версию приложения, как показано ниже
PackageManager manager = getPackageManager(); PackageInfo info = null; try { info = manager.getPackageInfo(getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } assert info != null; version = info.versionName;
после этого вы можете сравнить его с версией магазина и настроить собственные экраны обновления
if(version.equals(latestVersion)){ Toast.makeText(getBaseContext(), "No Update" , Toast.LENGTH_SHORT).show(); }else { Toast.makeText(getBaseContext(), "Update" , Toast.LENGTH_SHORT).show(); }
И добавьте VersionChecker.class, как показано ниже.
public class VersionChecker extends AsyncTask<String, String, String> { private String newVersion; @Override protected String doInBackground(String... params) { try { newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + "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(".hAyfc .htlgb") .get(7) .ownText(); } catch (IOException e) { e.printStackTrace(); } return newVersion; } }
источник
Настройте сервер, который предоставляет URL-адрес HTTP, который сообщает о последней версии, затем используйте AlarmManager для вызова этого URL-адреса и посмотрите, совпадает ли версия на устройстве с последней версией. Если это не так, выскочите сообщение или уведомление и отправьте их на рынок для обновления.
Вот несколько примеров кода: Как разрешить пользователям проверять наличие последней версии приложения изнутри приложения?
источник
Помимо использования JSoup, мы также можем выполнить сопоставление с образцом для получения версии приложения из playStore.
Чтобы соответствовать последнему шаблону из игрового магазина Google, то есть
<div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div>
сначала нужно сопоставить указанную выше последовательность узлов, а затем из указанной выше последовательности получить значение версии. Ниже приведен фрагмент кода для того же:private String getAppVersion(String patternString, String inputString) { try{ //Create a pattern Pattern pattern = Pattern.compile(patternString); if (null == pattern) { return null; } //Match the pattern string in provided string Matcher matcher = pattern.matcher(inputString); if (null != matcher && matcher.find()) { return matcher.group(1); } }catch (PatternSyntaxException ex) { ex.printStackTrace(); } return null; } private String getPlayStoreAppVersion(String appUrlString) { final String currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>"; final String appVersion_PatternSeq = "htlgb\">([^<]*)</s"; String playStoreAppVersion = null; BufferedReader inReader = null; URLConnection uc = null; StringBuilder urlData = new StringBuilder(); final URL url = new URL(appUrlString); uc = url.openConnection(); if(uc == null) { return null; } uc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); inReader = new BufferedReader(new InputStreamReader(uc.getInputStream())); if (null != inReader) { String str = ""; while ((str = inReader.readLine()) != null) { urlData.append(str); } } // Get the current version pattern sequence String versionString = getAppVersion (currentVersion_PatternSeq, urlData.toString()); if(null == versionString){ return null; }else{ // get version from "htlgb">X.X.X</span> playStoreAppVersion = getAppVersion (appVersion_PatternSeq, versionString); } return playStoreAppVersion; }
Я решил эту проблему, так как это работает и для последних изменений в Google PlayStore. Надеюсь, это поможет.
источник
private void CheckUPdate() { VersionChecker versionChecker = new VersionChecker(); try { String appVersionName = BuildConfig.VERSION_NAME; String mLatestVersionName = versionChecker.execute().get(); if(!appVersionName.equals(mLatestVersionName)){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity.this); alertDialog.setTitle("Please update your app"); alertDialog.setMessage("This app version is no longer supported. Please update your app from the Play Store."); alertDialog.setPositiveButton("UPDATE NOW", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { final String appPackageName = getPackageName(); try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName))); } catch (android.content.ActivityNotFoundException anfe) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName))); } } }); alertDialog.show(); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } @SuppressLint("StaticFieldLeak") public class VersionChecker extends AsyncTask<String, String, String> { private 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(".hAyfc .htlgb") .get(7) .ownText(); } catch (IOException e) { e.printStackTrace(); } return newVersion; } }
источник
Для этого нет официального GooglePlay API.
Но вы можете использовать эту неофициальную библиотеку для получения данных о версии приложения.
И, если вышеуказанное не работает для вас, вы всегда можете http подключиться к странице своего приложения (например, https://play.google.com/store/apps/details?id=com.shots.android&hl=en ) и проанализируйте поле «Текущая версия».
источник
Вы можете попробовать следующий код, используя Jsoup
String latestVersion = doc.getElementsContainingOwnText("Current Version").parents().first().getAllElements().last().text();
источник
Google представил api для обновления в приложении. Используя это, мы можем попросить пользователя обновить приложение внутри приложения. Если пользователь соглашается, мы можем напрямую загрузить последнее приложение и установить его без перенаправления в игровой магазин. для получения более подробной информации перейдите по ссылке ниже
ссылка1 ссылка2
источник
подтвердил, что только этот метод работает сейчас:
newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + AcMainPage.this.getPackageName() + "&hl=it") .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(5) .ownText();
источник
Google представил функцию обновлений в приложении ( https://developer.android.com/guide/app-bundle/in-app-updates ), она работает на Lollipop + и дает вам возможность запросить у пользователя обновление с помощью приятного диалог (ГИБКИЙ) или с обязательным полноэкранным сообщением (НЕМЕДЛЕННО).
Вот как будет выглядеть Гибкое обновление:
и вот поток немедленного обновления:
Вы можете проверить мой ответ здесь https://stackoverflow.com/a/56808529/5502121, чтобы получить полный пример кода для реализации как гибкого, так и немедленного потоков обновления. Надеюсь, это поможет!
источник