ฉันมีแอปใน Google Play Store เมื่อมีเวอร์ชันอัปเดตเวอร์ชันเก่าจะใช้ไม่ได้นั่นคือหากผู้ใช้ไม่อัปเดตแอปผู้ใช้จะไม่เข้าสู่แอป ฉันจะบังคับให้ผู้ใช้อัปเดตแอปเมื่อเวอร์ชันใหม่พร้อมใช้งานได้อย่างไร
ฉันมีแอปใน Google Play Store เมื่อมีเวอร์ชันอัปเดตเวอร์ชันเก่าจะใช้ไม่ได้นั่นคือหากผู้ใช้ไม่อัปเดตแอปผู้ใช้จะไม่เข้าสู่แอป ฉันจะบังคับให้ผู้ใช้อัปเดตแอปเมื่อเวอร์ชันใหม่พร้อมใช้งานได้อย่างไร
คำตอบ:
ฉันเห็นด้วยกับประเด็นของ Scott Helme ในคำตอบอื่นที่นี่ แต่ในสถานการณ์ที่รุนแรงบางอย่าง (ปัญหาด้านความปลอดภัยการเปลี่ยนแปลงการทำลาย API ... ) ที่คุณต้องการให้ผู้ใช้อัปเดตเพื่อใช้งานแอปต่อไปคุณสามารถจัดเตรียม API การกำหนดเวอร์ชันที่เรียบง่าย API จะมีลักษณะดังนี้:
versionCheck API:
ขอพารามิเตอร์:
int appVersionการตอบสนอง
boolean forceUpgradeboolean recommendUpgradeเมื่อแอปของคุณเริ่มต้นคุณสามารถเรียก API นี้ที่ส่งผ่านในเวอร์ชันปัจจุบันของแอปและตรวจสอบการตอบสนองของการเรียก API การกำหนดเวอร์ชัน
หากforceUpgradeมีtrueให้แสดงกล่องโต้ตอบป๊อปอัปพร้อมตัวเลือกเพื่อให้ผู้ใช้ออกจากแอปหรือไปที่ Google Play Store เพื่ออัปเกรดแอป
หาก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
เริ่มจาก Android 5.0 ที่ทำได้อย่างง่ายดายผ่านกลไกการอัปเดต Google Play In App ใหม่ ข้อกำหนดคือต้องมีไลบรารี Play Core เวอร์ชัน 1.5.0+ และใช้ App Bundles idstribution แทน apks
ไลบรารีมี 2 วิธีในการแจ้งผู้ใช้เกี่ยวกับการอัปเดต:
มีความยืดหยุ่นเมื่อผู้ใช้สามารถใช้แอปต่อไปได้ในขณะที่กำลังอัปเดตอยู่เบื้องหลัง
หน้าจอปิดกั้นทันทีที่ไม่อนุญาตให้ผู้ใช้เข้าสู่แอพจนกว่าพวกเขาจะอัปเดต
มีขั้นตอนต่อไปในการใช้งาน:
ขั้นตอนการใช้งานทั้งหมดเหล่านี้มีรายละเอียดอธิบายไว้ในเว็บไซต์อย่างเป็นทางการ: https://developer.android.com/guide/app-bundle/in-app-updates
คำตอบของสก็อตและไมเคิลถูกต้อง โฮสต์บริการที่ระบุหมายเลขเวอร์ชันขั้นต่ำที่คุณรองรับและเปรียบเทียบกับเวอร์ชันที่ติดตั้ง หวังว่าคุณจะไม่จำเป็นต้องใช้สิ่งนี้ แต่มันช่วยชีวิตได้หากมีบางเวอร์ชันออกมาคุณต้องฆ่าอย่างแน่นอนเนื่องจากข้อบกพร่องร้ายแรงบางอย่าง
ฉันแค่ต้องการเพิ่มโค้ดสำหรับสิ่งที่ต้องทำต่อไป ต่อไปนี้คือวิธีที่คุณเปิดใช้งาน Google Play Intent และนำไปยังเวอร์ชันใหม่ของคุณในสโตร์หลังจากแจ้งให้ผู้ใช้ทราบว่าต้องอัปเกรด
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) หรือด้วยข้อความบังคับแบบเต็มหน้าจอ (ทันที)
คุณต้องดำเนินการอย่างหลัง ลักษณะจะเป็นดังนี้:

ฉันครอบคลุมรหัสทั้งหมดในคำตอบนี้: https://stackoverflow.com/a/56808529/5502121
Google อย่างเป็นทางการมี Android API สำหรับสิ่งนี้
ขณะนี้ API อยู่ระหว่างการทดสอบกับพันธมิตรจำนวนหนึ่งและจะพร้อมใช้งานสำหรับนักพัฒนาทุกคนในเร็ว ๆ นี้
อัปเดต API พร้อมใช้งานแล้ว - https://developer.android.com/guide/app-bundle/in-app-updates
ขอแนะนำให้ตรวจสอบฟังก์ชันการกำหนดค่าระยะไกลของ Firebaseสำหรับสิ่งนี้
ฉันติดตั้งโดยใช้พารามิเตอร์ - app_version_enabled - โดยมีเงื่อนไข "Disabled Android Versions" ที่มีลักษณะดังนี้:
applies if App ID == com.example.myapp and App version regular expression ^(5.6.1|5.4.2)
ค่าเริ่มต้นสำหรับพารามิเตอร์คือ "จริง" แต่เวอร์ชัน Android ที่ปิดใช้งานมีค่าเป็นเท็จ ใน regex ของฉันสำหรับเวอร์ชัน Android ที่ปิดใช้งานคุณสามารถเพิ่มเวอร์ชันที่ปิดใช้งานเพิ่มเติมได้โดยใช้อีกเวอร์ชันหนึ่ง|{version name}ภายในวงเล็บเหล่านั้น
จากนั้นฉันก็ตรวจสอบว่าการกำหนดค่าระบุว่าเวอร์ชันเปิดใช้งานอยู่หรือไม่ - ฉันมีกิจกรรมที่ฉันเปิดตัวซึ่งบังคับให้ผู้ใช้อัปเกรด ฉันเช็คอินเพียงสองแห่งที่แอปสามารถเปิดใช้งานได้จากภายนอก (กิจกรรมตัวเรียกใช้งานเริ่มต้นของฉันและกิจกรรมการจัดการตามเจตนา) เนื่องจากการกำหนดค่าระยะไกลทำงานบนพื้นฐานแคชจึงจะไม่จับแอปเวอร์ชัน "ปิดใช้งาน" ในทันทีหากไม่ผ่านเวลาที่จำเป็นเพื่อให้แคชเป็นโมฆะ แต่จะใช้เวลาไม่เกิน 12 ชั่วโมงหากคุณไป ค่าการหมดอายุแคชที่แนะนำ
ตรวจสอบรหัสเวอร์ชันของ apk ในเครื่องและ play store
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
ในการบังคับให้ผู้ใช้แอปอัปเดตหากมีการอัปเดตในตลาดก่อนอื่นคุณควรตรวจสอบเวอร์ชันของแอปในตลาดและเปรียบเทียบกับเวอร์ชันของแอปบนอุปกรณ์ หากแตกต่างกันอาจเป็นการอัปเดตที่พร้อมใช้งาน ในโพสต์นี้ฉันได้เขียนโค้ดสำหรับการรับเวอร์ชันปัจจุบันของตลาดและเวอร์ชันปัจจุบันบนอุปกรณ์และเปรียบเทียบเข้าด้วยกัน ฉันยังแสดงวิธีแสดงกล่องโต้ตอบการอัปเดตและเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอัปเดต โปรดไปที่ลิงค์นี้: https://stackoverflow.com/a/33925032/5475941ตรวจสอบให้แน่ใจว่าในกล่องโต้ตอบคุณจะแสดงปุ่มอัปเดตผู้ใช้เท่านั้นและไม่แสดงปุ่มยกเลิกให้เขาเห็น ในกรณีนี้เขาจะถูกบังคับให้อัปเดตก่อนที่จะสามารถใช้แอปได้
สิ่งที่แน่นอนควรจะได้รับการกล่าวถึงที่นี่เป็นเร็ว ๆ นี้เพื่อได้รับการปล่อยตัวในแอปพลิอัพเดท API
คุณมีสองตัวเลือกสำหรับ API นี้ ประการแรกคือประสบการณ์แบบเต็มหน้าจอสำหรับการอัปเดตที่สำคัญเมื่อคุณคาดว่าผู้ใช้จะต้องรอให้การอัปเดตใช้งานได้ทันที ตัวเลือกที่สองคือการอัปเดตที่ยืดหยุ่นซึ่งหมายความว่าผู้ใช้สามารถใช้แอปต่อไปได้ในขณะที่ดาวน์โหลดอัปเดต คุณสามารถปรับแต่งขั้นตอนการอัปเดตได้ทั้งหมดเพื่อให้รู้สึกเหมือนเป็นส่วนหนึ่งของแอปของคุณ
เป็นความคิดที่ดีที่จะใช้การกำหนดค่าระยะไกลสำหรับเวอร์ชันของแอปและการตรวจสอบในกิจกรรมการเปิดตัวเสมอคือเวอร์ชันของแอปปัจจุบันจะเหมือนกับเวอร์ชันระยะไกลหรือไม่หากไม่บังคับให้อัปเดตจากร้านแอป ..
ตรรกะง่ายๆ happy coding ..
คุณสามารถใช้การอัปเดตในแอป Play Core Library เพื่อแก้ไขปัญหานี้ คุณสามารถตรวจสอบความพร้อมในการอัปเดตและติดตั้งได้หากมีอย่างราบรื่น
การอัปเดตในแอปเข้ากันไม่ได้กับแอปที่ใช้ไฟล์สำหรับขยาย 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 Remote
คุณสามารถอ่านบทแนะนำทั้งหมดเกี่ยวกับวิธีบังคับให้ผู้ใช้อัปเดตแอปโดยใช้ Firebase Remote Config
Google เปิดตัว In-App Updates สำหรับไลบรารี 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);
ถ้า (CompareArray) {กลับเท็จ; }
if (! CompareArray) {สำหรับ (var i = 0; i <activeVersionArr.length; i ++) {
if (activeVersionArr [i]! == currentVersionArr [i]) {
if (activeVersionArr [i]> currentVersionArr [i]) { กลับจริง; } else {กลับเท็จ; }
}}}