[android] 프로그래밍 방식으로 Play 스토어에서 앱 업데이트 확인

내 앱을 Google Play 스토어에 올렸습니다. 우리 회사의 많은 고객이 설치했습니다. 앱의 업그레이드 방식에 대한 메커니즘을 이해합니다.

사용자는 자동 업데이트하려는 각 앱에 대해 Playstore 앱에서 자동 업데이트 확인란을 선택해야합니다. 그러나 일부 사용자는 처음부터 확인을 취소했거나 확인하지 않았습니다.

내가 작성한 앱은 간병 산업을위한 것이며 간병인이 홈 케어를 제공하는 데 사용됩니다. 내 고객 중 일부는 1200 명의 간병인이 있습니다. 그들은 전화를 개별적으로 업데이트하기 위해 모든 간병인에게 사무실로 전화해야 할 것입니다. 이것은 분명히 받아 들일 수없는 일입니다.

Play 스토어에 내 앱의 업데이트 된 버전이 있는지 프로그래밍 방식으로 확인할 수있는 방법이 있나요?

사용자가 Play 스토어를 확인하는 앱을 시작할 때마다 실행되는 코드를 가질 수 있나요? 업데이트 된 버전이있는 경우 사용자는 플레이 스토어로 이동할 수 있습니다. 이것은 자동 업데이트를 체크 할 필요가 없다는 것을 의미합니다.

미리 감사드립니다

매트



답변

업데이트 2019 년 10 월 17 일

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

2019 년 4 월 24 일 업데이트 :

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 스토어 페이지에서이 값을 가져와야합니다 (그동안 변경되어 더 이상 작동하지 않음).

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

모바일에서 사용되는 버전이 자체 API에 표시된 버전 번호보다 낮은 지 앱에서 확인하십시오.

이상적으로는 알림으로 업데이트해야한다는 표시를 보여줍니다.

할 수있는 일

자체 API를 사용하는 버전 번호

장점 :

  • Google Play 스토어의 전체 코드를로드 할 필요가 없습니다 (데이터 / 대역폭 절약).

단점 :

  • 사용자가 오프라인 일 수 있으므로 API에 액세스 할 수 없기 때문에 확인이 필요하지 않습니다.

웹 페이지 Google Play 스토어의 버전 번호

장점 :

  • API가 필요하지 않습니다.

단점 :

  • 사용자가 오프라인 일 수 있으므로 API에 액세스 할 수 없기 때문에 확인이 필요하지 않습니다.
    • 이 방법을 사용하면 사용자에게 더 많은 대역폭 / 모바일 데이터 비용이 발생할 수 있습니다.
    • Play 스토어 웹 페이지가 변경되어 버전 ‘리퍼’가 더 이상 작동하지 않을 수 있습니다.


답변

앱 build.gradle 파일에 JSoup 포함 :

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을 방문하십시오.


답변

Google이 API를 노출하지 않았기 때문에 Firebase 원격 구성 은 현재로서는 가능하고 안정적인 솔루션이 될 수 있습니다.

Firebase 원격 구성 문서 확인

단계
1. Firebase 프로젝트를 만들고 프로젝트에 google_play_service.json을 추가합니다.

2. firebase console-> Remote Config에서 ‘android_latest_version_code’및 ‘android_latest_version_name’과 같은 키를 만듭니다.

3. 안드로이드 코드

    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 모두에서 작동합니다.


답변

다음과 같이 수정 하여 현재 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 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의 라이브러리. 포함 방법 :

  1. 프로젝트 build.gradle에 저장소를 추가합니다 .
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
  1. 모듈 build.gradle에 라이브러리를 추가하십시오 .
dependencies {
    compile 'com.github.javiersantos:AppUpdater:2.6.4'
}
  1. 앱의 Manifest에 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();