Подтвердить что ты не робот

Программно проверьте Play Store для обновлений приложений.

Я разместил свое приложение в Google Play Store. Он был установлен многочисленными клиентами моей компании. Я понимаю механизм обновления приложения.

Пользователи должны установить флажок автообновления в приложении playstore для каждого приложения, которое они хотят автоматически обновить. Однако некоторые пользователи отключили его или не проверили в первую очередь.

Приложение, которое я написал, предназначено для индустрии ухода и используется лицами, осуществляющими уход, для доставки на родину. Некоторые из наших клиентов имеют 1200 опекунов. Им нужно было позвонить всем опекунам в офис, чтобы обновить телефоны по отдельности. Это явно неприемлемо.

Есть ли способ программно проверить, есть ли обновленная версия моего приложения в Play Маркете?

Могу ли я иметь код, который запускается каждый раз, когда пользователь запускает приложение, которое проверяет Play Store? Если есть обновленная версия, пользователь может быть направлен в игровой магазин. Это будет означать, что не обязательно проверять автоматическое обновление.

Заранее спасибо

Matt

4b9b3361

Ответ 1

Обновление 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

Оригинал:

Насколько я знаю, нет официального API Google, который бы это поддерживал.

Вы должны рассмотреть возможность получения номера версии от 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 (экономит на данных/пропускной способности)

Минусы:

  • Пользователь может находиться в автономном режиме, что делает проверку бесполезной, так как API недоступен

Номер версии на веб-странице Google Play Store

Плюсы:

  • Вам не нужен API

Минусы:

  • Пользователь может быть в автономном режиме, что делает проверку бесполезной, так как API не доступен
    • Использование этого метода может стоить вашим пользователям большей пропускной способности/мобильных данных
    • Веб-страница магазина игр может измениться, из-за чего ваша версия 'ripper' больше не работает.

Ответ 2

Включите 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("div[itemprop=softwareVersion]")
                    .first()
                    .ownText();
            return newVersion;
        } catch (Exception e) {
            return newVersion;
        }
    }

    @Override
    protected void onPostExecute(String onlineVersion) {
        super.onPostExecute(onlineVersion);
        if (onlineVersion != null && !onlineVersion.isEmpty()) {
            if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
                //show dialog
            }
        }
        Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);
    }

Подробнее см. http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html

Ответ 3

Firebase Remote Config может быть возможным и надежным решением на данный момент, так как google не отображал для него никакого api.

Отметьте Firebase Remote Config Docs

Действия 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.

Ответ 4

Вы можете получить текущую версию JSoup с помощью JSoup с некоторыми изменениями, как 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 больше не работает.

Ответ 5

Там есть библиотека AppUpdater. Как включить:

  1. Добавьте репозиторий в проект build.gradle:
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
  1. Добавьте библиотеку в модуль build.gradle:
dependencies {
    compile 'com.github.javiersantos:AppUpdater:2.6.4'
}
  1. Добавьте разрешения INTERNET и ACCESS_NETWORK_STATE в ваше приложение. Манифест:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. Добавьте это в свою деятельность:
AppUpdater appUpdater = new AppUpdater(this); 
appUpdater.start();

Ответ 6

Ответ @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'}

и на создание()

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

}

что это.. Благодаря этой ссылке

Ответ 7

Переход из гибридного приложения POV. Это пример javascript, у меня есть нижний колонтитул Update Available в главном меню. Если обновление доступно (т.е. Мой номер версии в файле конфигурации меньше, чем найденная версия, отобразите нижний колонтитул) Затем он направит пользователя в магазин приложений/воспроизведения, где пользователь может нажать кнопку обновления.

Я также получаю новые данные (например, заметки о выпуске) и отображаю их в модальном имени, если он первый раз в этой версии.

На устройстве 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';

Доступный метод Update можно запускать так часто, как вам нравится. Mine запускается каждый раз, когда пользователь переходит на главный экран.

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 Callback: у 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('&nbsp;');
        // Release Notes
        settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
    }
}

Android Callback: 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('&nbsp;');
        // 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"/>

Ответ 8

Внутри метода 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, как показано ниже.

открытый класс VersionChecker расширяет AsyncTask {

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

}

Ответ 9

Firebase Remote Config лучше.

  • Быстро и легко обновлять наши приложения без необходимости публикации новой сборки в приложении.

Внедрение удаленной конфигурации на Android

Добавление зависимостей Remote Config

compile 'com.google.firebase:firebase-config:9.6.0'

После этого мы можем получить доступ к экземпляру FirebaseRemoteConfig в нашем приложении, где это необходимо:

FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

Получение значений удаленной конфигурации

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 do something with it!
                        if(appVersion < CurrentVersion){
                           //show update dialog
                        }
                    } else {
                        // Looks like there was a problem getting the config...
                    }
                }
            });

Теперь, когда вы загрузили новую версию в playstore, нам нужно обновить номер версии внутри firebase. Теперь, если это новая версия, отобразится диалоговое окно обновления

Ответ 10

Настройте сервер, который предоставляет HTTP-url, который сообщает о последней версии, затем используйте AlarmManager для вызова этого URL-адреса и проверьте, совпадает ли версия на устройстве с последней версией. Если он не выдает сообщение или уведомление и не отправляет их на рынок для обновления.

Есть несколько примеров кода: Как разрешить пользователям проверять последнюю версию приложения внутри приложения?

Ответ 11

Помимо использования JSoup, мы также можем использовать сопоставление шаблонов для получения версии приложения из playStore.

Чтобы соответствовать последнему шаблону из Google PlayStore, т.е. <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">XXX</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. Надеюсь, это поможет.

Ответ 12

enter image description here

Google представил API обновлений в приложении

В настоящее время API поддерживает два потока:

  • "Непосредственный" поток представляет собой полноэкранный пользовательский интерфейс, который направляет пользователя от загрузки к обновлению, прежде чем он сможет использовать ваше приложение.
  • "Гибкий поток" позволяет пользователям загружать обновления, продолжая использовать ваше приложение.

Ответ 13

Для этого не существует официального API GooglePlay.

Но вы можете использовать эту неофициальную библиотеку, чтобы получить данные о версии приложения.

И если вышеуказанное не работает для вас, вы всегда можете подключиться к странице своего приложения http (например, https://play.google.com/store/apps/details?id=com.shots.android&hl=en) и проанализируйте поле "Текущая версия".

Ответ 14

Вы можете попробовать следующий код, используя Jsoup

String latestVersion = doc.getElementsContainingOwnText("Current Version").parents().first().getAllElements().last().text();

Ответ 15

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

Ответ 16

подтвердил только этот метод работы сейчас:

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

Ответ 18

enter image description here Google представил обновление api в приложении. Используя это, мы можем попросить пользователя обновить приложение внутри приложения. Если пользователь согласен, мы можем напрямую загрузить последнюю версию приложения и установить ее без перенаправления в playstore. для более подробной информации, пожалуйста, обратитесь по ссылке ниже

ссылка1 ссылка2

Ответ 19

Google представил функцию обновлений в приложении (https://developer.android.com/guide/app-bundle/in-app-updates), которая работает на Lollipop+ и дает вам возможность попросить пользователя обновить с хороший диалог (ГИБКИЙ) или с обязательным полноэкранным сообщением (НЕМЕДЛЕННЫЙ).

Вот как будет выглядеть Гибкое обновление: enter image description here

и вот поток немедленного обновления: enter image description here

Вы можете проверить мой ответ здесь fooobar.com/info/124294/... чтобы получить полный пример кода реализации гибких и немедленных потоков обновления. Надеюсь, поможет!