구글의 플레이스토어에서 가장 문제가 된다고 생각하는 부분은,
어플리케이션이 독립적으로 최신버전을 확인하도록 할 수 있는 방법을 제공하지 않는다는 것입니다.
구글의 안드로이드는 '플레이스토어'라고 하는 앱마켓을 기반으로 앱을 관리하고 있습니다.
보통 앱의 최신버전은 마켓을 통해서 자동 업데이트 되지만
앱마켓의 캐시에 따라 앱의 버전 배포가 일정하지 않아 유저마다 앱이 최신버전으로 자동업데이트 되는 시점이 일치하지 않고
심지어 유저가 앱마켓에서 자동 업데이트를 설정하지 않는 경우에는,
유저가 앱 마켓을 실행하지 않으면 앱의 최신버전 업데이트를 알리거나 강제할 수 있는 방법이 없습니다.
버전 파편화가 심한 안드로이드가 이러한 시스템으로 인하여 앱의 버전 파편화까지 발생하는것이 가장 큰 문제점이라고 생각합니다.
따라서 많은 앱에서는 앱 자체적으로 최신버전과 앱의 버전 비교를 수행하여
유저에게 신규버전의 업데이트를 알리는 코드를 추가로 구현하고 있습니다.
상기의 과정을 구현하는 방법은 여러가지가 있으나,
별도의 서버구축을 하지않고 유저들마다 일정하지않은 앱마켓의 캐시업데이트를 반영하기 위해서
여러가지 예제에서는 JSOUP를 이용하여 구글 플레이 스토어를 파싱하는 방법을 제안하고 있습니다.
JSOUP의 기본적인 사용방법은 많이 찾아볼 수 있으나, 코드를 파싱하는 방법의 주요 포인트는 아래와 같습니다.
구글 스토어의 앱 상세정보 페이지의 소프트웨어버전 부분을 파싱하여 앱의 버전과 비교한 뒤,
앱의 버전이 낮을 경우 최신버전 업데이트를 유저에게 알려주는 과정을 수행하게 만드는것입니다.
Document doc = Jsoup
.connect(
"https://play.google.com/store/apps/details?id=패키지명")
.get();
Elements Version = doc.select(".content");
for (Element v : Version) {
if (v.attr("itemprop").equals("softwareVersion")) {
VersionMarket = v.text();
}
}
'18년 3월 중순까지도 문제없던 상기의 코드가 앱의 버전을 가져오지 못한다는 것을 오늘 발견하여
체크해보니 null값을 가져오는것을 확인하였습니다.
플레이스토어의 페이지 모양이 다소 바뀌었던것을 잠깐 봤던 기억이 있어 코드를 살펴보니 큰폭으로 바뀌었습니다.
상기 페이지의 코드를 살펴보면 아래와 같습니다.
이전에는 명확했던 class 명들이 바뀌어 파싱하지 못하고 null 값을 나타내게 됩니다.
클래스명이 내용을 명확하게 설명하지 않기 때문에 전처럼 파싱하는 코드를 사용할 수 없어
아래와 같이 수정해주었습니다.
Document doc = Jsoup
.connect(
"https://play.google.com/store/apps/details?id=패키지명")
.get();
Elements Version = doc.select(".htlgb ");
VersionMarket = Version.get(3).text();
상기의 코드는 Jsoup를 이용하여 앱의 상세정보 페이지를 Document로 가져온 뒤,
htlgp 클래스를 모두 가져와 Elements를 만들고, 4번째값인 현재버전을 파싱하는 코드입니다.
파싱을 위해 코드를 수정하여 보니, 명확하게 지정해주어야 앱의 상세정보들을 확인할 수 있었던 이전의 구조와는 달리,
htlgb 부분을 통해서 상세정보들을 한번에 가져올 수 있게 바뀌었습니다.
따라서 sql과 같은 데이터베이스를 사용하는것처럼 데이터를 선택해줌으로서 앱의 상세정보들을 이용할 수 있도록 바뀐 것 같습니다.
아무래도 자체서버를 이용하여 최신버전을 확인하게 하는 편이 훨씬 더 안정적이지만,
이용자마다 차이가 나는 마켓 캐시 업데이트를 반영하지 못하고
별도 서버를 운영하지 않아도 확인할 수 있기 때문에 계속해서 사용해 왔지만,
이렇게 갑작스럽게 코드구조가 바뀌어 버릴경우에는 발견하기가 힘듭니다.
앱의 신규버전 알림과 업데이트를 앱에 자체적으로 알려줄 수있는 라이브러리를 구성해 주는 것이
어렵지 않을텐데도 왜 기능을 구현해 주지 않을까요.
// 18.04.03 내용 추가
구글 플레이 스토어의 상세정보 값들이 또 변경되었습니다.
플레이스토어 업데이트 이후 일부 앱들에서 앱 용량값이 null 로 표시되는 것들이 있었는데
해당 항목이 삭제되면서 앱 버전 순서가 변경되었습니다.
따라서 상기 코드를 사용할 경우, 필요한 Android 버전 (Requires Android) 값을 가지고 오게 됩니다.
https://stackoverflow.com/questions/49543526/android-app-with-size-null-in-play-store
스택오버플로우에 의하면 현재 구글 플레이 스토어의 일부 앱에서 App Size가 null 값으로 표기되는 현상이 있습니다.
위에서 동일한 문제를 언급하였는데, 구글 플레이 스토어측에서는 null로 표기되는 Size 항목을 아예 삭제 해버린것으로 보이고
이것이, 또다른 문제를 발생시키는 원인이 되었습니다.
최근 플레이스토어를 새롭게 업데이트 하는 작업중에 자잘한 버그들이 발생하고 있는것으로 확인됩니다.
아마도, Size 항목의 삭제는 null 값에 대한 임시변통으로 생각되고,
문제 수정 후에는 Size 항목이 다시 추가되면서 상세정보값의 순서가 또 바뀔수도 있기때문에
기존의 코드처럼 파싱해올 항목을 정확하게 지정하지 않고, 어느정도 유연하게 대응할 수 있도록 코드를 변경 해 주었습니다.
try {
Document doc = Jsoup
.connect(
"https://play.google.com/store/apps/details?id=패키지명")
.get();
Elements Version = doc.select(".htlgb ");
for (int i = 0; i < 5 ; i++) {
VersionMarket = Version.get(i).text();
if (Pattern.matches("^[0-9]{1}.[0-9]{1}.[0-9]{1}$", VersionMarket)) {
break;
}
}
return VersionMarket;
상단의 코드는 for 반복문과 정규식 패턴검사를 이용하였습니다.
for 문으로 0부터 상세정보값들을 계속 읽어가되, 정규식으로 0~9로 이루어진 x.x.x 패턴(2.0.0 과 같은 버전 정보)이 확인될 경우
for 문을 break로 중단하는 구문입니다.
이제 클래스값이 다시 변화하지 않는 한도에서는 유연하게 대응할 수 있습니다.
// 19.04.03 내용 추가
try {
Document doc = Jsoup
.connect(
"https://play.google.com/store/apps/details?id=패키지명")
.get();
Elements Version = doc.select(".htlgb ");
for (int i = 0; i < 20 ; i++) {
VersionMarket = Version.get(i).text();
if (Pattern.matches("^[0-9]{1}.[0-9]{1}.[0-9]{1}$", VersionMarket)) {
break;
}
}
return VersionMarket;
플레이 스토어의 태그 위치가 자꾸 변하여 숫자를 변경해주어야 인식하는 경우가 있습니다.
어플리케이션 상세정보 화면에 대략 23개 정도의 .htlgb 값이 존재하기 때문에
20으로 변경시켜놓으면 태그명이 바뀌지 않는한 작동합니다.
'Android > Dev' 카테고리의 다른 글
알림바(Notification Bar)를 누를 때 프레그먼트 실행 하기 (0) | 2018.04.10 |
---|---|
뷰페이저 사용 시 특정 프레그먼트로 이동하기 (0) | 2018.04.10 |
앱 빌드 후 android.permission.READ_PHONE_STATE 추가현상 (0) | 2018.03.31 |
안드로이드 인앱 결제 Google Play Billing Library (1) | 2018.03.02 |
Fragment 를 사용할 때 EditText의 Focus를 없애기 (3) | 2018.02.23 |
댓글