본문 바로가기

android

안드로이드 앱 구글플레이 앱버전 확인하기 - 앱 업데이트 체크

반응형

"AppUpdateManager 를 이용한 앱 업데이트" 를 이용해 보시는건 어떠신가요?

아래 링크를 클릭해 보세요.


https://snowbike.tistory.com/76


=======================================================


안드로이드 앱을 구글플레이에 업로드 후 앱 버전이 올라갔을때,

앱 업데이트 확인을 위해서 "구글플레이" 정보를 파싱해서 구글플레이 버전과 디바이스 버전을 비교하는 방식을 사용했었다.


그런데, 2018년 3~4월 경 부터 해당 기능이 정상적으로 동작하지 않았다.


"구글플레이" 사이트 구성이 약간 변경된것으로 판단됩니다.


그래서 새로 만들어서 테스트했는데, 정상적으로 동작해서, 참고하고자 작성한다.


기존에는 softwareVersion 을 찾아서 처리했으나, 이번에는 htlgb 클래스를 이용한다.


jericho htmlparser 는 아래에서 다운로드한다.

https://sourceforge.net/projects/jerichohtml/files/jericho-html/3.4/jericho-html-3.4.zip/download



하지만, 임시조치이며 결과적으로

Firebase 원격구성 firebase-config 을 사용하거나 자체서버를 만들어서 API를 통한 서비스를 하는것을 권장합니다.

또 언제 바뀔지 모르니...


=============================================================

package com.test;


import android.content.Context;


import net.htmlparser.jericho.Element;

import net.htmlparser.jericho.Source;


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.UnknownHostException;

import java.util.Arrays;

import java.util.List;

import java.util.StringTokenizer;

import java.util.regex.Pattern;


public class MarketVersion {

    public static String TAG = "MarketVersion";


    /**

     * 구글플레이에서 앱 버전 정보를 가져와서 기기 앱 버전과 비교한다. (play.google.com)

     * 앱 버전은 "1000.1.1.1" 인 "4자리.1자리.1자리.1자리" 형식으로 구성해야 한다.

     * 앱 버전 형식은 "형식 수정하는곳" 라인 코드를 변경하여 임의로 변경이 가능하다.

     * 참고 사이트 https://stackoverflow.com/questions/49441843/google-playstore-app-version-check-not-working-any-more

     * jericho htmlparser를 이용하며, 다른 파서를 응용하면 가능하다.

     *

     * @param  context

     * @return bVersionCheck 마켓버전이 높은 경우 true 리턴, 동일하거나 디바이스 버전이 높은 경우, 오류시 false 리턴

     */


    public static boolean getMarketVersion(Context context) throws Exception {


        boolean bVersionCheck = false; // 마켓버전이 높은 경우 true 리턴, 동일하거나 디바이스 버전이 높은 경우 false 리턴한다.


        try {

            String sUrl = "https://play.google.com/store/apps/details?id=" + context.getPackageName() + "&hl=en";


            Source source = new Source(getStringFromURL(sUrl, "UTF-8"));


            source.fullSequentialParse();


            List<Element> Version = source.getAllElementsByClass("htlgb");


            String sMarketVersion = ""; // 마켓 버전

            int[] iMarketVersion = new int[4];


            for (int i = 0; i < Version.size(); i++) {

                String sTxt = Version.get(i).getTextExtractor().toString().trim();

                if (Pattern.matches("^[0-9]{4}.[0-9]{1}.[0-9]{1}.[0-9]{1}$", sTxt)) { // 형식 수정하는곳

                    sMarketVersion = sTxt;

                    break;

                }

            }


            if (sMarketVersion.length() < 1) {

                throw new Exception("마켓 버전 sMarketVersion.length가 1보다 작음");

            }


            StringTokenizer sMvTxt = new StringTokenizer(sMarketVersion, ".");


            int iMvCnt = 0;

            while (sMvTxt.hasMoreElements()) {

                String sToken = sMvTxt.nextToken();

                if (sToken.length() > 0) {

                    iMarketVersion[iMvCnt] = Integer.valueOf(sToken);

                }

                iMvCnt++;

            }


            String sDeviceVersion = ""; // 디바이스 버전

            int[] iDeviceVersion = new int[4];


            try {

                sDeviceVersion = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;

            } catch (Exception e) {

                e.printStackTrace();

            }


            if (sDeviceVersion.length() < 1) {

                throw new Exception("디바이스 버전 sDeviceVersion.length가 1보다 작음");

            }


            StringTokenizer sDvTxt = new StringTokenizer(sDeviceVersion, ".");


            int iDvCnt = 0;

            while (sDvTxt.hasMoreElements()) {

                String sToken = sDvTxt.nextToken();

                if (sToken.length() > 0) {

                    iDeviceVersion[iDvCnt] = Integer.valueOf(sToken); // 배열변수에 넘버를 하나씩 넣는다..

                }

                iDvCnt++;

            }


            for (int n = 0; n < 4; n++) {

                if (iMarketVersion[n] > iDeviceVersion[n]) {// iMarketVersion 마켓버전, iDeviceVersion 디바이스버전 비교

                    bVersionCheck = true;

                    break;

                } else if (iMarketVersion[n] < iDeviceVersion[n]) {

                    break;

                }

            }


            Dlog.i(TAG, "MarketVersion.java | getMarketVersion| 마켓버전 iMarketVersion= " + Arrays.toString(iMarketVersion));

            Dlog.i(TAG, "MarketVersion.java | getMarketVersion| 디바이스버전 iDeviceVersion= " + Arrays.toString(iDeviceVersion));


        } catch (Exception e) {

            e.printStackTrace();

        }


        Dlog.i(TAG, "MarketVersion.java | getMarketVersion (line 160) | = " + (bVersionCheck ? "마켓버전 높음" : "마켓버전 동일 or 낮음 or 오류 발생"));


        return bVersionCheck;

    }


    /*

     * HttpURLConnection 를 이용한다.

     */

    private static String getStringFromURL(String sURL, String charsetName) throws Exception {

        StringBuffer sbResult = new StringBuffer();

        BufferedReader br = null;

        HttpURLConnection connection = null;

        try {

            URL url = new URL(sURL);

            connection = (HttpURLConnection) url.openConnection();

            if (connection != null) {

                connection.setConnectTimeout(3000);

                connection.setReadTimeout(3000);

                connection.setRequestProperty("User-Agent", "Mozilla/5.0");

                connection.setUseCaches(false);

                connection.setDefaultUseCaches(false);

                connection.connect();


                int status = connection.getResponseCode(); // HTTP 상태코드


                if (status == HttpURLConnection.HTTP_OK) {

                    br = new BufferedReader(new InputStreamReader(connection.getInputStream(), charsetName));

                    String strLine = null;

                    while ((strLine = br.readLine()) != null) {

                        sbResult.append(strLine + "\n");

                    }

                    br.close();

                } else {

                    throw new UnknownHostException("UnknownHostException response status: " + status);

                }

                connection.disconnect();

            }

        } catch (Exception e) {

            e.printStackTrace();

            throw e;

        } finally {

            if (connection != null) {

                connection.disconnect();

            }


            if (br != null) {

                br.close();

            }


        }

        return sbResult.toString();

    }


}

반응형