Google Play 스토어에 앱이 있습니다. 업데이트 버전이 있으면 이전 버전을 사용할 수 없게됩니다. 즉, 사용자가 앱을 업데이트하지 않으면 앱에 들어 가지 않습니다. 새 버전을 사용할 수있게되면 사용자가 앱을 강제로 업데이트하도록하려면 어떻게해야합니까?
답변:
나는 여기에 다른 대답에서 Scott Helme의 요점에 동의합니다. 그러나 앱을 계속 사용하기 위해 사용자가 반드시 업데이트해야하는 극단적 인 상황 (보안 문제, API 중단 변경 ...)에서는 간단한 버전 관리 API를 제공 할 수 있습니다. API는 다음과 같습니다.
versionCheck API :
요청 매개 변수 :
int appVersion응답
boolean forceUpgradeboolean recommendUpgrade앱이 시작되면 현재 앱 버전을 전달하는이 API를 호출하고 버전 관리 API 호출의 응답을 확인할 수 있습니다.
경우 forceUpgrade이며 true, 하나에 옵션이있는 팝업 대화 상자를 보여 사용자가 응용 프로그램을 종료하자, 또는 응용 프로그램을 업그레이드 Google Play 스토어로 이동합니다.
그렇지 않은 경우 recommendUpgrade입니다 true업데이트하거나 응용 프로그램을 계속 사용하는 옵션이있는 팝업 대화 상자를 표시합니다.
이 강제 업그레이드 기능이 있더라도 꼭 필요한 경우가 아니면 이전 버전을 계속 지원해야합니다.
시도해보세요 : 먼저 playstore 링크에 대한 요청 호출을 만들고 거기에서 현재 버전을 가져온 다음 현재 버전과 비교해야합니다.
String currentVersion, latestVersion;
Dialog dialog;
private void getCurrentVersion(){
PackageManager pm = this.getPackageManager();
PackageInfo pInfo = null;
try {
pInfo = pm.getPackageInfo(this.getPackageName(),0);
} catch (PackageManager.NameNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
currentVersion = pInfo.versionName;
new GetLatestVersion().execute();
}
private class GetLatestVersion extends AsyncTask<String, String, JSONObject> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected JSONObject doInBackground(String... params) {
try {
//It retrieves the latest version by scraping the content of current version from play store at runtime
Document doc = Jsoup.connect(urlOfAppFromPlayStore).get();
latestVersion = doc.getElementsByClass("htlgb").get(6).text();
}catch (Exception e){
e.printStackTrace();
}
return new JSONObject();
}
@Override
protected void onPostExecute(JSONObject jsonObject) {
if(latestVersion!=null) {
if (!currentVersion.equalsIgnoreCase(latestVersion)){
if(!isFinishing()){ //This would help to prevent Error : BinderProxy@45d459c0 is not valid; is your activity running? error
showUpdateDialog();
}
}
}
else
background.start();
super.onPostExecute(jsonObject);
}
}
private void showUpdateDialog(){
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("A New Update is Available");
builder.setPositiveButton("Update", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse
("market://details?id=yourAppPackageName")));
dialog.dismiss();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
background.start();
}
});
builder.setCancelable(false);
dialog = builder.show();
}
새 버전이 나 오자마자 이전 버전 지원을 중단해서는 안됩니다. 이것은 끔찍한 사용자 경험을 초래할 것입니다. 이 작업을 수행하는 소프트웨어 공급 업체는 타당한 이유가 없습니다.
사용자가 업데이트 할 수 없거나 업데이트를 원하지 않으면 어떻게 되나요? 그들은 단순히 앱을 사용할 수 없습니다.
Google은 이와 같은 버전 추적에 대한 옵션을 제공하지 않으므로 직접 실행해야합니다. 앱에서 확인할 수있는 현재 라이브 버전을 반환하는 간단한 웹 서비스이면 충분합니다. 그런 다음 버전을 업데이트하면 앱에서 오래된 버전임을 알 수 있습니다. Google Play에 의존하는 것보다 더 빨리 업데이트가 있음을 사용자에게 알리기 위해서만이 기능을 사용하는 것이 좋습니다. 앱의 작동을 막는 데 사용해서는 안되며 사용자에게 업데이트하라는 메시지 만 표시하면됩니다.
Google 팀의 솔루션
새로운 Google Play In App 업데이트 메커니즘을 통해 쉽게 달성 할 수있는 Android 5.0부터 시작합니다. 요구 사항은 버전 1.5.0 이상의 Play Core 라이브러리를 보유하고 apk 대신 App Bundle ID 배포를 사용하는 것입니다.
라이브러리는 업데이트에 대해 사용자에게 알리는 두 가지 방법을 제공합니다.
사용자가 백그라운드에서 업데이트되는 동안 앱을 계속 사용할 수있는 유연성.
즉시-사용자가 앱을 업데이트 할 때까지 앱에 들어가는 것을 허용하지 않는 차단 화면입니다.
이를 구현하기위한 다음 단계가 있습니다.
이러한 모든 단계 구현은 공식 사이트 https://developer.android.com/guide/app-bundle/in-app-updates 에 자세히 설명되어 있습니다.
Scott과 Michael의 대답이 맞습니다. 지원하는 최소 버전 번호를 제공하는 서비스를 호스팅하고 설치된 버전과 비교합니다. 당신은 이것을 사용할 필요가 없길 바라지 만, 만약 어떤 버전이 거기에 있다면 당신은 심각한 결함으로 인해 절대적으로 죽여야 만하는 생명의 은인입니다.
다음에 수행 할 작업에 대한 코드를 추가하고 싶었습니다. 그런 다음 Google Play 인 텐트를 실행하고 사용자에게 업그레이드해야한다는 메시지를 표시 한 후 스토어에서 새 버전으로 가져가는 방법은 다음과 같습니다.
public class UpgradeActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upgrade);
final String appName = "com.appname";
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id="+appName)));
}
});
}
}
각 릴리스에서 업그레이드를 강제해야하는 경우 디자인을 재고해야합니다.
Google은 인앱 업데이트 lib ( https://developer.android.com/guide/app-bundle/in-app-updates )를 도입 했으며 Lollipop +에서 작동하며 사용자에게 멋진 업데이트를 요청할 수있는 기능을 제공합니다. 대화 상자 (FLEXIBLE) 또는 필수 전체 화면 메시지 (IMMEDIATE).
이 답변의 모든 코드를 다루었습니다 : https://stackoverflow.com/a/56808529/5502121
공식적으로 Google은이를 위해 Android API를 제공합니다.
API는 현재 소수의 파트너와 함께 테스트 중이며 곧 모든 개발자에게 제공 될 예정입니다.
업데이트 API는 지금 사용 가능합니다-https: //developer.android.com/guide/app-bundle/in-app-updates
이를 위해 Firebase의 원격 구성 기능을 확인하는 것이 좋습니다 .
다음과 같은 "Disabled Android Versions"조건으로 app_version_enabled 매개 변수를 사용하여 구현했습니다.
applies if App ID == com.example.myapp and App version regular expression ^(5.6.1|5.4.2)
매개 변수의 기본값은 "true"이지만 비활성화 된 Android 버전의 값은 false입니다. 비활성화 된 Android 버전에 대한 정규식에서 |{version name}해당 괄호 안에 다른 비활성화 된 버전을 추가 할 수 있습니다 .
그런 다음 구성에서 버전이 활성화되었는지 여부를 확인합니다. 사용자가 업그레이드하도록 강제하는 활동이 있습니다. 외부에서 앱을 실행할 수있는 두 곳 (내 기본 런처 활동 및 인 텐트 처리 활동) 만 체크인합니다. 원격 구성은 캐시 기반으로 작동하기 때문에 캐시를 무효화하는 데 필요한 시간이 지나지 않은 경우 앱의 '사용 중지 된'버전을 즉시 캡처하지 않지만, 계속 진행하는 경우 최대 12 시간입니다. 권장 캐시 만료 값입니다.
로컬 및 Play 스토어 APK의 버전 코드 확인
try {
versionChecker VersionChecker = new versionChecker();
String versionUpdated = VersionChecker.execute().get().toString();
Log.i("version code is", versionUpdated);
PackageInfo packageInfo = null;
try {
packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
int version_code = packageInfo.versionCode;
String version_name = packageInfo.versionName;
Log.i("updated version code", String.valueOf(version_code) + " " + version_name);
if (version_name != versionUpdated) {
String packageName = getApplicationContext().getPackageName();//
UpdateMeeDialog updateMeeDialog = new UpdateMeeDialog();
updateMeeDialog.showDialogAddRoute(MainActivity.this, packageName);
Toast.makeText(getApplicationContext(), "please updated", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
e.getStackTrace();
}
버전 확인을위한 클래스 구현
class versionChecker extends AsyncTask<String, String, String> {
String newVersion;
@Override
protected String doInBackground(String... params) {
try {
newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=+YOR_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("div[itemprop=softwareVersion]")
.first()
.ownText();
} catch (IOException e) {
e.printStackTrace();
}
return newVersion;
}
}
업데이트 용 다이얼 롭 박스
public class UpdateMeeDialog {
ActivityManager am;
TextView rootName;
Context context;
Dialog dialog;
String key1,schoolId;
public void showDialogAddRoute(Activity activity, final String packageName){
context=activity;
dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.dialog_update);
am = (ActivityManager)activity.getSystemService(Context.ACTIVITY_SERVICE);
Button cancelDialogue=(Button)dialog.findViewById(R.id.buttonUpdate);
Log.i("package name",packageName);
cancelDialogue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://play.google.com/store/apps/details?
id="+packageName+"&hl=en"));
context.startActivity(intent);
}
});
dialog.show();
}
}
대화 레이아웃
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d4e9f2">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="Please Update First..!!"
android:textSize="20dp"
android:textColor="#46a5df"
android:textAlignment="center"
android:layout_marginTop="50dp"
android:id="@+id/textMessage"
/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:weightSum="1"
android:layout_marginTop="50dp"
android:layout_below="@+id/textMessage"
android:layout_height="50dp">
<Button
android:id="@+id/buttonUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Update"
android:background="#67C6F1"
android:textAlignment="center" />
</LinearLayout>
업그레이드를 위해 자체 프로세스를 정의하는 것이 좋습니다.
Android 및 iOS : 최신 앱 버전이있는 경우 "더 많은 기능이있는 최신 버전을 사용할 수 있습니다. 업그레이드하려면 업그레이드 버튼을 클릭하십시오."( "Upgarde"및 "아니요. 감사합니다"버튼으로 알림) 경고가 표시됩니다. 그러면 앱이 다음으로 리디렉션됩니다. playstore / Appstore를 선택하면 최신 버전이 열립니다.
--- we can do upgrade compulsory or optionally.
업그레이드 프로세스 전에 db 스키마 변경이있는 경우 적절한 db 마이그레이션 프로세스를 처리했는지 확인하십시오.
시장에서 업데이트가 가능한 경우 앱 사용자에게 업데이트를 강요하려면 먼저 시장의 앱 버전을 확인하고 기기의 앱 버전과 비교해야합니다. 다른 경우 사용 가능한 업데이트 일 수 있습니다. 이 게시물에서는 장치에서 현재 버전의 시장과 현재 버전을 가져 와서 함께 비교하는 코드를 작성했습니다. 또한 업데이트 대화 상자를 표시하고 사용자를 업데이트 페이지로 리디렉션하는 방법도 보여주었습니다. 다음 링크를 방문하십시오 : https://stackoverflow.com/a/33925032/5475941 대화 상자에서 사용자 업데이트 버튼 만 표시하고 취소 버튼은 표시하지 않는지 확인하세요. 이 경우 앱을 사용하기 전에 업데이트해야합니다.
여기서 확실히 언급해야 할 것은 곧 출시 될 인앱 업데이트 API 입니다.
이 API에는 두 가지 옵션이 있습니다. 첫 번째는 업데이트가 즉시 적용될 때까지 사용자가 기다릴 것으로 예상 할 때 중요 업데이트에 대한 전체 화면 환경입니다. 두 번째 옵션은 유연한 업데이트로, 업데이트가 다운로드되는 동안 사용자가 앱을 계속 사용할 수 있습니다. 앱의 일부처럼 느껴지도록 업데이트 흐름을 완전히 사용자 지정할 수 있습니다.
앱 버전에 대해 원격 구성을 사용하고 항상 체크인 활동을 확인하는 것이 좋습니다. 현재 앱 버전이 원격 버전과 동일하거나 앱 스토어에서 강제로 업데이트하지 않으면 그렇지 않습니다 ..
간단한 논리 해피 코딩 ..
Play Core 라이브러리 인앱 업데이트를 사용하여이 문제를 해결할 수 있습니다. 업데이트 가용성을 확인하고 가능한 경우 원활하게 설치할 수 있습니다.
인앱 업데이트는 APK 확장 파일 (.obb 파일)을 사용하는 앱과 호환되지 않습니다. 유연한 다운로드를 받거나 Google Play에서 업데이트를 다운로드하고 설치하는 즉시 업데이트 할 수 있습니다.
dependencies {
implementation 'com.google.android.play:core:1.5.0'
...
}
이 답변을 참조하십시오 https://stackoverflow.com/a/58212818/7579041
변수에있는 앱에 유지되는 버전 번호를 일치 시켜서이를 수행 할 수 있으며, 유사하게 현재 앱 버전이 서버 측에 유지되며 사용자가 앱을 열 때마다 첫 번째 요청을 보내어 확인해야합니다. 매칭은 단순히 사용자가 앱을 사용하도록합니다. 그렇지 않으면 Google Playstore에 인 텐트를 실행하거나 앱에 대한 웹뷰 창을 엽니 다 (window.open ( " https://play.google.com/store/apps/details?id= package_name ", '_system', 'location = yes');) 자동 업데이트가 설정되지 않은 경우 Google Playstore가 수행하는 업데이트를 요청하는 버튼이 자동으로 표시됩니다.
업데이트 할 수있는 현재 앱의 새 버전이 있음을 사용자에게 알릴 수 있습니다. 또한이 조건이 참이면 앱에서 로그인을 차단할 수 있습니다.
이것이 솔루션을 제공 하는지 확인하십시오 .
음, 앱 페이지 (Google Play 앱 페이지)에서 버전 코드를 스크랩하는 등이 문제에 대한 많은 솔루션이있을 수 있습니다.
하지만 저는 한 푼도 들지 않고 마법처럼 작동하는 궁극적 인 솔루션을 보여 드리겠습니다.
다음 코드에서 얻을 수있는 앱의 현재 버전 코드와 비교합니다.
private int getCurrentVersionCode() {
try {
return getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return -1;
}
가져온 버전 코드가 현재 버전보다 큰 경우 앱 업데이트를 요청하는 AlertDialog를 표시합니다. 그렇지 않으면 앱이 이미 업데이트되었습니다.
따라서 새 버전을 출시 할 때마다 Firebase 원격 구성 패널에 새 버전 코드를 입력해야합니다.
Firebase 원격 구성을 사용하여 사용자가 앱을 업데이트하도록하는 방법 에 대한 전체 가이드를 읽을 수 있습니다.
Google은 Play Core 라이브러리에 대한 인앱 업데이트를 출시했습니다.
인앱 업데이트를 쉽게 구현하기 위해 경량 라이브러리를 구현했습니다. 다음 링크에서 사용자가 업데이트를 수행하도록 강제하는 방법에 대한 예를 찾을 수 있습니다.
https://github.com/dnKaratzas/android-inapp-update#forced-updates
var activeVersion = "3.9.2";
var currentVersion = "3.9.1";
var activeVersionArr = activeVersion.split ( "."); var currentVersionArr = currentVersion.split ( ".");
var compareArray = JSON.stringify (activeVersionArr) == JSON.stringify (currentVersionArr);
if (compareArray) {return false; }
if (! compareArray) {for (var i = 0; i <activeVersionArr.length; i ++) {
if (activeVersionArr [i]! == currentVersionArr [i]) {
if (activeVersionArr [i]> currentVersionArr [i]) { true를 반환하십시오. } else {반환 거짓; }
}}}