Kiểm tra theo chương trình Cửa hàng Play để biết các bản cập nhật ứng dụng


92

Tôi đã đưa ứng dụng của mình lên Cửa hàng Google Play. Nó đã được cài đặt bởi rất nhiều khách hàng của công ty tôi. Tôi hiểu cơ chế về cách ứng dụng dự định nâng cấp.

Người dùng nên chọn hộp kiểm tự động cập nhật trong ứng dụng cửa hàng chơi cho mỗi ứng dụng họ muốn tự động cập nhật. Tuy nhiên, một số người dùng đã bỏ chọn hoặc không kiểm tra nó ngay từ đầu.

Ứng dụng tôi đã viết dành cho ngành chăm sóc và được những người chăm sóc sử dụng để cung cấp dịch vụ chăm sóc tại nhà. Một số khách hàng của chúng tôi có 1200 người chăm sóc. Họ sẽ phải gọi tất cả những người chăm sóc vào văn phòng để cập nhật điện thoại cho từng cá nhân. Điều này rõ ràng là không thể chấp nhận được.

Có cách nào để kiểm tra theo chương trình xem có phiên bản cập nhật của ứng dụng của tôi trên Cửa hàng Play không?

Tôi có thể có mã chạy mỗi khi người dùng khởi động ứng dụng kiểm tra Cửa hàng Play không? Nếu có phiên bản cập nhật thì người dùng có thể được dẫn đến cửa hàng chơi. Điều này có nghĩa là không cần thiết phải kiểm tra cập nhật tự động.

Cảm ơn trước

Matt


Không phải cửa hàng Play đã gửi thông báo đến người dùng nếu có bản cập nhật cho một ứng dụng?
Nischaal Cooray

1
Ứng dụng của bạn có kết nối với đám mây / internet không với API bạn đã viết - Vì bạn có thể chỉ cần có một biến 'phiên bản' mà bạn có thể cập nhật theo cách thủ công - khi mở ứng dụng, hãy kiểm tra phiên bản cục bộ với phiên bản đám mây - nếu chúng khác, đề xuất bản cập nhật
gavlaaaaaaaa

Tôi đã từng sử dụng jsoup để làm điều này, nhưng bây giờ sử dụng regex để trích xuất trường Phiên bản hiện tại .
Geezer McNubbins 12/12/18

Câu trả lời:


42

Cập nhật ngày 17 tháng 10 năm 2019

https://developer.android.com/guide/app-bundle/in-app-updates

Cập nhật ngày 24 tháng 4 năm 2019:

Android đã công bố một tính năng có thể sẽ khắc phục sự cố này. Sử dụng API cập nhật trong ứng dụng: https://android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsummit.html

Nguyên:

Theo tôi biết, không có API chính thức của Google hỗ trợ điều này.

Bạn nên cân nhắc để lấy số phiên bản từ API.

Thay vì kết nối với các API hoặc trang web bên ngoài (như Cửa hàng Google Play). Có một rủi ro là điều gì đó có thể thay đổi trong API hoặc trang web, vì vậy bạn nên cân nhắc để kiểm tra xem mã phiên bản của ứng dụng hiện tại có thấp hơn số phiên bản bạn nhận được từ API của riêng mình hay không.

Chỉ cần nhớ nếu bạn cập nhật ứng dụng của mình, bạn cần thay đổi phiên bản trong API của riêng mình bằng số phiên bản ứng dụng.

Tôi khuyên bạn nên tạo một tệp trong trang web hoặc API của riêng bạn, với số phiên bản. (Cuối cùng tạo cronjob và cập nhật phiên bản tự động và gửi thông báo khi có sự cố)

Bạn phải nhận giá trị này từ trang Cửa hàng Google Play của mình (được thay đổi trong thời gian chờ đợi, không hoạt động nữa):

<div class="content" itemprop="softwareVersion"> x.x.x  </div>

Kiểm tra ứng dụng của bạn nếu phiên bản được sử dụng trên thiết bị di động thấp hơn số phiên bản được hiển thị trên API của riêng bạn.

Tốt nhất là thể hiện dấu hiệu rằng cô ấy / anh ấy cần cập nhật thông báo.

Những điều bạn có thể làm

Số phiên bản sử dụng API của riêng bạn

Ưu điểm:

  • Không cần tải toàn bộ mã của Cửa hàng Google Play (tiết kiệm dữ liệu / băng thông)

Nhược điểm:

  • Người dùng có thể ngoại tuyến, điều này làm cho việc kiểm tra trở nên vô ích vì không thể truy cập API

Số phiên bản trên trang web Cửa hàng Google Play

Ưu điểm:

  • Bạn không cần API

Nhược điểm:

  • Người dùng có thể ngoại tuyến, điều này làm cho việc kiểm tra trở nên vô ích vì không thể truy cập API
    • Sử dụng phương pháp này có thể khiến người dùng của bạn tốn thêm băng thông / dữ liệu di động
    • Trang web cửa hàng Play có thể thay đổi khiến phiên bản 'ripper' của bạn không hoạt động nữa.

Số phiên bản trên trang web của Cửa hàng Google Play hiện đã Current Versionđược liệt kê dưới dạng Varies with devicebất kỳ ý tưởng nào về cách điều này có thể được giải quyết hoặc nếu có bất kỳ giải pháp thay thế nào khác ??
shadygoneinsane


Thật. Đặt ra câu hỏi này vì chúng tôi không còn có thể truy cập vào nguồn html của trang google play của riêng chúng tôi khi thực hiện một truy vấn web. chúng tôi nhận được một FileNotFoundException.
Grisgram

Bạn sẽ thử một cái gì đó như tìm kiếm một div có chứa văn bản. Phiên bản hiện tại / Huidige versie Tìm số đầu tiên và chữ số chấm trong các div tiếp theo. <div class = "hAyfc"> <div class = "BgcNfc"> Huidige versie </div> <div> <span class = "htlgb"> 1.0 </span> </div>
Richard Lindhout

Tên lớp có thể sẽ được thay đổi trong mỗi lần cập nhật trên trang web của họ.
Richard Lindhout

35

Bao gồm JSoup trong tệp build.gradle ứng dụng của bạn:

dependencies {
    compile 'org.jsoup:jsoup:1.8.3'
}

và tải phiên bản hiện tại như:

currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

Và thực hiện chuỗi sau:

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

Để biết thêm chi tiết, hãy truy cập: http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html


trong @Override được bảo vệ void onPostExecute (String onlineVersion) {} nếu điều kiện cho phiên bản kiểm tra không được ở giá trị Float. Bởi vì nó có thể tạo ra lỗi như thế này java.lang.NumberFormatException không hợp lệ: float không hợp lệ: "1.0.6". Vì vậy, hãy sử dụng cái này. if (! currentVersion.equalsIgnoreCase (onlineVersion)) {....}
Dharmishtha

1
Bất kỳ ý tưởng về cách làm điều đó mà không có Jsoup?
Hitesh Sahu

@HiteshSahu thân mến, bạn sẽ phải truy cập vào URL cửa hàng chơi " play.google.com/store/apps/details?id=com.whatsapp&hl=vi ". URL Trang Mở này. Nhấp chuột phải vào trang và nhấp vào tùy chọn "Xem Nguồn Trang". Trong html của trang, bạn có thể thấy thuộc tính: "<div class =" content "itemprop =" softwareVersion "> 1.2 </div>". Bạn phải phân tích cú pháp html và lấy cờ này theo cách thủ công.
Tarun

2
getPackageManager().getPackageInfo(getPackageName(), 0).versionNameBạn chỉ có thể sử dụng BuildConfig.VERSION_NAME:)
Enoobong

1
Đó rõ ràng là một tên lớp được tạo có thể thay đổi bất cứ lúc nào. Bạn không nên làm điều này.
Richard Lindhout

24

Firebase Remote Config có thể là một giải pháp khả thi và đáng tin cậy hiện tại, vì google không tiết lộ bất kỳ api nào cho nó.

Kiểm tra tài liệu cấu hình từ xa của Firebase

Các bước 1: Tạo một dự án firebase và thêm google_play_service.json vào dự án của bạn

2.Tạo các khóa như "android_latest_version_code" và "android_latest_version_name" trong bảng điều khiển firebase-> Cấu hình từ xa

3. Mã 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);
}

Nhận tên và mã phiên bản hiện tại

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. Và cập nhật firebase "android_latest_version_code" và "android_latest_version_name" với tên và mã phiên bản sản xuất hiện tại của bạn.

Cấu hình từ xa Firebase hoạt động trên cả Android và IPhone.


1
Xem firebasetutorials.com/… để tạo các tham số trong Firebase.
CoolMind

Tôi nghĩ rằng, giải pháp này có thể dẫn đến lỗi biên dịch: Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 68703 > 65536). Trong trường hợp này, bạn nên thêm MultiDex vào ứng dụng của mình.
CoolMind

17

Bạn có thể tải phiên bản Playstore hiện tại bằng JSoupmột số sửa đổi như sau:

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

câu trả lời của @Tarun không hoạt động nữa.


Đây là bạn đang làm việc nhưng tôi có thể dựa vào điều này mãi mãi hay nó sẽ thay đổi trong tương lai gần ??
Avinash Roy

1
Không nên dựa vào điều này vì nó không phải là giải pháp chính thức.
Nikunj

@Nikunj Tôi tạo một lớp GetVersionCode mở rộng AsyncTask và khi tôi viết mã của bạn bên trong lớp đó getPackageName () hiển thị lỗi. Tôi đã thử cái này, GetVersionCode.this nhưng không có gì hoạt động.
Aashish

1
Sử dụng .select (". HAyfc .htlgb"). Get (7) không hiệu quả với các thay đổi. Tôi đã thấy một giải pháp khác sử dụng chỉ mục 5 để thay thế. Để chọn đúng, tôi sử dụng truy vấn mở rộng .select (". HAyfc .BgcNfc: containsOwn (Phiên bản hiện tại) + .htlgb.htlgb"). First () .text ()
HarryS

8

Câu trả lời @Tarun đã hoạt động hoàn hảo. Nhưng bây giờ thì không, do những thay đổi gần đây từ Google trên trang web google play.

Chỉ cần thay đổi những điều này từ câu trả lời @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);

    }
}

và đừng quên thêm thư viện JSoup

dependencies {
compile 'org.jsoup:jsoup:1.8.3'}

và trên 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();

}

thế là xong .. Cảm ơn liên kết này


8

nhập mô tả hình ảnh ở đây

Google đã giới thiệu API cập nhật trong ứng dụng

API hiện hỗ trợ hai luồng:

  • Luồng "ngay lập tức" là trải nghiệm người dùng toàn màn hình hướng dẫn người dùng từ tải xuống đến cập nhật trước khi họ có thể sử dụng ứng dụng của bạn.
  • "Luồng linh hoạt" cho phép người dùng tải xuống bản cập nhật trong khi tiếp tục sử dụng ứng dụng của bạn.

Câu trả lời tốt nhất!!! Cảm ơn
Artem Beziazychnyi

7

Có thư viện AppUpdater . Làm thế nào để bao gồm:

  1. Thêm kho lưu trữ vào dự án build.gradle của bạn :
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
  1. Thêm thư viện vào mô-đun build.gradle của bạn :
dependencies {
    compile 'com.github.javiersantos:AppUpdater:2.6.4'
}
  1. Thêm quyền INTERNET và ACCESS_NETWORK_STATE vào Tệp kê khai ứng dụng của bạn:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. Thêm cái này vào hoạt động của bạn:
AppUpdater appUpdater = new AppUpdater(this); 
appUpdater.start();

Không hoạt động dù sao. Sử dụng mã sau, vui lòng cho tôi biết tôi đang làm gì sai.
Anurag Srivastava

Xin chào, tôi nghĩ rằng có một lỗi. Vui lòng kiểm tra cuộc thảo luận này github.com/javiersantos/AppUpdater/issues/132
stenlytw

6

Đến từ một ứng dụng kết hợp POV. Đây là một ví dụ về javascript, tôi có một chân trang Có sẵn Cập nhật trên menu chính của mình. Nếu có bản cập nhật (tức là số phiên bản của tôi trong tệp cấu hình ít hơn phiên bản được truy xuất, hãy hiển thị chân trang) Sau đó, điều này sẽ hướng người dùng đến cửa hàng ứng dụng / play, nơi người dùng có thể nhấp vào nút cập nhật.

Tôi cũng nhận được dữ liệu mới (tức là Ghi chú phát hành) và hiển thị chúng trong một phương thức khi đăng nhập nếu đây là lần đầu tiên trên phiên bản này.

Trên thiết bị Sẵn sàng, hãy đặt URL cửa hàng của bạn

        if (device.platform == 'iOS')
           storeURL = 'https://itunes.apple.com/lookup?bundleId=BUNDLEID';
        else
           storeURL = 'https://play.google.com/store/apps/details?id=BUNDLEID';

Phương thức Cập nhật Có sẵn có thể được chạy thường xuyên nếu bạn muốn. Của tôi được chạy mỗi khi người dùng điều hướng đến màn hình chính.

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

Gọi lại iOS: Apple có một API nên rất dễ lấy

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 bạn phải tìm kiếm, vì bạn có thể thấy phiên bản này tương đối dễ lấy và có gì mới tôi lấy html thay vì văn bản vì cách này tôi có thể sử dụng định dạng của chúng (tức là các dòng mới, v.v.)

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

Logic của cửa hàng mở là thẳng về phía trước, nhưng để hoàn thiện

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')
}

Đảm bảo Cửa hàng Play và Cửa hàng ứng dụng đã được đưa vào Danh sách trắng:

  <access origin="https://itunes.apple.com"/>
  <access origin="https://play.google.com"/>

Tôi gặp lỗi "Lỗi phân tích cú pháp phản hồi ajax: SyntaxError: Mã thông báo không mong muốn <". khi ajax get được gọi. Bạn có thể làm sáng tỏ điều này, điều gì đã xảy ra?
Kapilrc

ios hay android? url của bạn có đúng không? đưa bạn đến trang chính xác trên trình duyệt?
tyler_mitchell

5

Cấu hình từ xa Firebase tốt hơn.

  • Cập nhật nhanh chóng và dễ dàng các ứng dụng của chúng tôi mà không cần xuất bản bản dựng mới cho ứng dụng

Triển khai cấu hình từ xa trên Android

Thêm phụ thuộc cấu hình từ xa

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

Sau khi hoàn tất, chúng tôi có thể truy cập phiên bản FirebaseRemoteConfig trong toàn bộ ứng dụng của mình nếu được yêu cầu:

FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

Truy xuất giá trị Cấu hình từ xa

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

Tìm nạp giá trị phía máy chủ

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

Bây giờ sau khi tải phiên bản mới lên playstore, chúng tôi phải cập nhật số phiên bản bên trong firebase. Bây giờ nếu là phiên bản mới, hộp thoại cập nhật sẽ hiển thị


5

Bên trong phương thức OnCreate viết mã bên dưới ..

VersionChecker versionChecker = new VersionChecker();
    try {
        latestVersion = versionChecker.execute().get();
        Toast.makeText(getBaseContext(), latestVersion , Toast.LENGTH_SHORT).show();

    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }

điều này cung cấp cho bạn phiên bản cửa hàng chơi của ứng dụng ..

thì bạn phải kiểm tra phiên bản ứng dụng như bên dưới

PackageManager manager = getPackageManager();
    PackageInfo info = null;
    try {
        info = manager.getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    assert info != null;
    version = info.versionName;

sau đó, bạn có thể so sánh nó với phiên bản cửa hàng và thiết lập màn hình cập nhật của riêng bạn

if(version.equals(latestVersion)){
        Toast.makeText(getBaseContext(), "No Update" , Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(getBaseContext(), "Update" , Toast.LENGTH_SHORT).show();

    }

Và thêm VersionChecker.class như bên dưới

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

3

Thiết lập máy chủ hiển thị url HTTP báo cáo phiên bản mới nhất, sau đó sử dụng AlarmManager để gọi URL đó và xem phiên bản trên thiết bị có giống với phiên bản mới nhất hay không. Nếu nó không bật lên một tin nhắn hoặc thông báo và gửi chúng đến thị trường để nâng cấp.

Có một số ví dụ về mã: Làm cách nào để cho phép người dùng kiểm tra phiên bản ứng dụng mới nhất từ ​​bên trong ứng dụng?


3

Ngoài việc sử dụng JSoup, chúng ta có thể thực hiện đối sánh mẫu để tải phiên bản ứng dụng từ playStore.

Để khớp với mẫu mới nhất từ ​​google playstore, tức là <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div> trước tiên chúng ta phải khớp với chuỗi nút ở trên và sau đó từ chuỗi trên lấy giá trị phiên bản. Dưới đây là đoạn mã cho cùng một:

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

Tôi đã giải quyết được vấn đề này, vì điều này cũng hoạt động đối với các thay đổi mới nhất của Google Playstore. Hy vọng rằng sẽ giúp.


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

Vui lòng cung cấp một số thông tin về cách thức và những gì mã này sẽ làm việc
DarkSuniuM

2

Không có API GooglePlay chính thức để làm điều đó.

Nhưng bạn có thể sử dụng thư viện không chính thức này để lấy dữ liệu phiên bản ứng dụng.

Và, nếu cách trên không hiệu quả với bạn, bạn luôn có thể http kết nối với trang ứng dụng của mình (ví dụ: https://play.google.com/store/apps/details?id=com.shots.android&hl=vi ) và phân tích cú pháp trường "Phiên bản hiện tại".


1
Lib này có từ năm 2011 và bị hỏng từ lâu
zyamys

2

Bạn có thể thử mã sau bằng Jsoup

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

2

nhập mô tả hình ảnh ở đâyGoogle đã giới thiệu api cập nhật trong ứng dụng. Sử dụng nó, chúng tôi có thể yêu cầu người dùng cập nhật ứng dụng bên trong ứng dụng. nếu người dùng chấp nhận, chúng tôi có thể trực tiếp tải xuống ứng dụng mới nhất và cài đặt mà không cần chuyển hướng đến cửa hàng chơi. để biết thêm chi tiết vui lòng tham khảo liên kết dưới đây

link1 link2


Tôi thích ảnh GIF bạn tạo :)
Hunter

1

chỉ xác nhận rằng phương pháp hoạt động bây giờ:

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

1

Google đã giới thiệu tính năng cập nhật trong ứng dụng , ( https://developer.android.com/guide/app-bundle/in-app-updates ), nó hoạt động trên Lollipop + và cung cấp cho bạn khả năng yêu cầu người dùng cập nhật một cách tốt đẹp hộp thoại (LINH HOẠT) hoặc với thông báo bắt buộc toàn màn hình (NGAY LẬP TỨC).

Đây là cách cập nhật Linh hoạt sẽ trông như thế nào: nhập mô tả hình ảnh ở đây

và đây là quy trình cập nhật Immedtiate : nhập mô tả hình ảnh ở đây

Bạn có thể kiểm tra câu trả lời của tôi tại đây https://stackoverflow.com/a/56808529/5502121 để nhận mã mẫu hoàn chỉnh về việc triển khai cả hai quy trình cập nhật Linh hoạtNgay lập tức . Hy vọng nó giúp!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.