ตรวจสอบการอัปเดตแอป Play Store โดยทางโปรแกรม


93

ฉันได้วางแอปของฉันบน Google Play Store แล้ว ได้รับการติดตั้งโดยลูกค้าของ บริษัท ของฉันจำนวนมาก ฉันเข้าใจกลไกของการอัปเกรดแอป

ผู้ใช้ควรเลือกช่องทำเครื่องหมายอัปเดตอัตโนมัติในแอป playstore สำหรับแต่ละแอปที่ต้องการอัปเดตอัตโนมัติ อย่างไรก็ตามผู้ใช้บางคนไม่ได้เลือกหรือไม่ได้ตรวจสอบตั้งแต่แรก

แอพที่ฉันเขียนมีไว้สำหรับอุตสาหกรรมการดูแลและผู้ดูแลใช้เพื่อส่งมอบบ้าน ลูกค้าของเราบางคนมีผู้ดูแล 1200 คน พวกเขาจะต้องเรียกผู้ดูแลทั้งหมดเข้ามาในสำนักงานเพื่ออัปเดตโทรศัพท์ทีละเครื่อง เห็นได้ชัดว่าสิ่งนี้ไม่สามารถยอมรับได้

มีวิธีตรวจสอบโดยทางโปรแกรมไหมว่ามีแอปเวอร์ชันอัปเดตของฉันใน Play Store หรือไม่

ฉันขอรหัสที่ทำงานทุกครั้งที่ผู้ใช้เปิดแอปที่ตรวจสอบ Play Store ได้ไหม หากมีเวอร์ชันอัปเดตผู้ใช้สามารถถูกนำไปที่ playstore ซึ่งหมายความว่าไม่จำเป็นต้องตรวจสอบการอัปเดตอัตโนมัติ

ขอบคุณล่วงหน้า

ม ธ


play store ไม่ได้แจ้งเตือนไปยังผู้ใช้แล้วหรือไม่ว่ามีการอัปเดตสำหรับแอปหรือไม่?
Nischaal Cooray

1
แอปพลิเคชันของคุณเชื่อมต่อกับระบบคลาวด์ / อินเทอร์เน็ตหรือไม่กับ API ที่คุณเขียนหรือไม่เนื่องจากคุณสามารถมีตัวแปร 'เวอร์ชัน' ที่คุณสามารถอัปเดตได้ด้วยตนเองในการเปิดแอปพลิเคชันให้ตรวจสอบเวอร์ชันท้องถิ่นด้วยเวอร์ชันคลาวด์หากมี แตกต่างกันแนะนำการอัปเดต
gavlaaaaaaaa

ผมเคยใช้ jsoup การทำเช่นนี้ แต่ตอนนี้ใช้ regex เพื่อดึงข้อมูลเวอร์ชันปัจจุบัน
Geezer McNubbins

คำตอบ:


42

อัปเดต 17 ตุลาคม 2562

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

อัปเดต 24 เมษายน 2019:

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 Store ของคุณ (มีการเปลี่ยนแปลงในระหว่างนี้ไม่ทำงานอีกต่อไป):

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

ตรวจสอบในแอปของคุณว่าเวอร์ชันที่ใช้บนอุปกรณ์เคลื่อนที่ต่ำกว่าเวอร์ชันที่แสดงบน API ของคุณเองหรือไม่

แสดงข้อบ่งชี้ว่าเธอ / เขาจำเป็นต้องอัปเดตด้วยการแจ้งเตือนตามความเหมาะสม

สิ่งที่คุณทำได้

หมายเลขเวอร์ชันโดยใช้ API ของคุณเอง

ข้อดี:

  • ไม่จำเป็นต้องโหลดรหัสทั้งหมดของ Google Play Store (บันทึกข้อมูล / แบนด์วิดท์)

จุดด้อย:

  • ผู้ใช้สามารถออฟไลน์ได้ซึ่งทำให้การตรวจสอบไร้ประโยชน์เนื่องจากไม่สามารถเข้าถึง API ได้

หมายเลขเวอร์ชันบนหน้าเว็บ Google Play Store

ข้อดี:

  • คุณไม่จำเป็นต้องมี API

จุดด้อย:

  • ผู้ใช้สามารถออฟไลน์ได้ซึ่งทำให้การตรวจสอบไร้ประโยชน์เนื่องจากไม่สามารถเข้าถึง API ได้
    • การใช้วิธีนี้อาจทำให้ผู้ใช้ของคุณเสียค่าแบนด์วิดท์ / ข้อมูลมือถือมากขึ้น
    • หน้าเว็บของ Play Store อาจเปลี่ยนแปลงได้ซึ่งทำให้ 'ripper' เวอร์ชันของคุณใช้งานไม่ได้อีกต่อไป

ตอนนี้หมายเลขเวอร์ชันบนหน้าเว็บของ Google Play Store ได้Current Versionระบุไว้เป็นVaries with deviceแนวคิดว่าจะแก้ไขได้อย่างไรหรือมีทางเลือกอื่นอีกหรือไม่ ??
Shadygoneinsane


แน่นอน. มาถึงคำถามนี้เนื่องจากเราไม่สามารถเข้าถึงแหล่งที่มา html ของหน้า Google Play ของเราเองได้อีกต่อไปเมื่อทำการร้องขอเว็บ เราได้รับ FileNotFoundException
Grisgram

จะลองบางอย่างเช่นมองหา div ที่มีข้อความ เวอร์ชันปัจจุบัน / เวอร์ชัน Huidige ค้นหาตัวเลขแรกและตัวเลขหลักใน divs ถัดไป <div class = "hAyfc"> <div class = "BgcNfc"> เวอร์ชัน Huidige </div> <div> <span class = "htlgb"> 1.0 </span> </div>
Richard Lindhout

ชื่อคลาสอาจมีการเปลี่ยนแปลงในทุกการอัปเดตบนเว็บไซต์
Richard Lindhout

35

รวม JSoup ไว้ในไฟล์ build.gradle ของแอปของคุณ:

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


ใน @Override มีการป้องกันโมฆะ onPostExecute (String onlineVersion) {} หากเงื่อนไขสำหรับตรวจสอบเวอร์ชันไม่ควรอยู่ในค่า Float เนื่องจากอาจทำให้เกิดข้อผิดพลาดเช่นนี้ java.lang.NumberFormatException ไม่ถูกต้อง: ลอยไม่ถูกต้อง: "1.0.6" ดังนั้นใช้สิ่งนี้ if (! currentVersion.equalsIgnoreCase (onlineVersion)) {.... }
Dharmishtha

1
มีความคิดอย่างไรกับการทำโดยไม่ใช้ Jsoup?
Hitesh Sahu

เรียน @HiteshSahu คุณจะต้องกด URL ของ playstore " play.google.com/store/apps/details?id=com.whatsapp&hl=th " URL เปิดเพจนี้ คลิกขวาที่เพจและคลิกที่ตัวเลือก "View Page Source" ใน html ของเพจคุณจะเห็นแอตทริบิวต์: "<div class =" content "itemprop =" softwareVersion "> 1.2 </div>" คุณต้องแยกวิเคราะห์ html และรับแฟล็กนี้ด้วยตนเอง
Tarun

2
getPackageManager().getPackageInfo(getPackageName(), 0).versionNameคุณสามารถใช้BuildConfig.VERSION_NAME:)
Enoobong

1
เห็นได้ชัดว่าเป็นชื่อคลาสที่สร้างขึ้นซึ่งสามารถเปลี่ยนแปลงได้ตลอดเวลา คุณไม่ควรทำเช่นนี้
Richard Lindhout

24

Firebase Remote Configอาจเป็นโซลูชันที่เป็นไปได้และเชื่อถือได้ในตอนนี้เนื่องจาก Google ไม่ได้เปิดเผย API ใด ๆ

ตรวจสอบFirebase Remote Config Docs

ขั้นตอนที่ 1. สร้างโปรเจ็กต์ firebase และเพิ่ม google_play_service.json ในโปรเจ็กต์ของคุณ

2. สร้างคีย์เช่น "android_latest_version_code" และ "android_latest_version_name" ใน firebase console-> Remote Config

3. รหัส Android

    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


1
ดูfirebasetutorials.com/…สำหรับการสร้างพารามิเตอร์ใน Firebase
CoolMind

Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 68703 > 65536)ผมคิดว่าวิธีนี้สามารถนำไปสู่การรวบรวมข้อผิดพลาด: ในกรณีนี้คุณควรเพิ่ม MultiDex ลงในแอปพลิเคชันของคุณ
CoolMind

17

คุณสามารถรับเวอร์ชัน 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 ไม่ทำงานอีกต่อไป


นี่คือเพื่อนร่วมงาน แต่ฉันสามารถพึ่งพาสิ่งนี้ได้ตลอดไปหรือจะเปลี่ยนไปในอนาคตอันใกล้ ??
Avinash Roy

1
ไม่แนะนำให้พึ่งพาสิ่งนี้เนื่องจากไม่ใช่วิธีแก้ปัญหาอย่างเป็นทางการ
Nikunj

@Nikunj ฉันสร้างคลาส GetVersionCode ที่ขยาย AsyncTask และเมื่อฉันเขียนโค้ดของคุณในคลาสนั้น getPackageName () แสดงข้อผิดพลาด ฉันลอง GetVersionCode แล้ว แต่ไม่มีอะไรทำงาน
Aashish

1
การใช้ .select (". hAyfc .htlgb") รับ (7) ไม่แข็งแกร่งต่อการเปลี่ยนแปลง ฉันเห็นวิธีแก้ปัญหาอื่นโดยใช้ดัชนี 5 แทน หากต้องการเลือกสิ่งที่ถูกต้องฉันใช้แบบสอบถามแบบขยาย .select (". hAyfc .BgcNfc: containsOwn (เวอร์ชันปัจจุบัน) + .htlgb.htlgb") first ()
.text

8

คำตอบ @Tarun ทำงานได้อย่างสมบูรณ์ แต่ตอนนี้ไม่ได้เนื่องจากการเปลี่ยนแปลงล่าสุดจาก Google บนเว็บไซต์ 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();

}

แค่นั้นเอง .. ขอบคุณลิงค์นี้


8

ป้อนคำอธิบายภาพที่นี่

Google ได้เปิดตัวAPI การอัปเดตในแอป

ปัจจุบัน API รองรับสองกระแส:

  • ขั้นตอน“ ทันที” คือประสบการณ์ของผู้ใช้แบบเต็มหน้าจอที่แนะนำผู้ใช้ตั้งแต่การดาวน์โหลดจนถึงอัปเดตก่อนที่จะใช้แอปของคุณได้
  • “ ขั้นตอนที่ยืดหยุ่น” ช่วยให้ผู้ใช้ดาวน์โหลดการอัปเดตในขณะที่ใช้แอปของคุณต่อไป

ตอบดีที่สุด !!! ขอบคุณ
Artem Beziazychnyi

7

มีห้องสมุด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. เพิ่มสิทธิ์อินเทอร์เน็ตและ 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();

ไม่ทำงาน แต่อย่างใด ใช้รหัสต่อไปนี้โปรดบอกฉันว่าฉันทำอะไรผิด
Anurag Srivastava

สวัสดีฉันคิดว่ามีข้อบกพร่อง โปรดตรวจสอบการสนทนานี้github.com/javiersantos/AppUpdater/issues/132
stenlytw

6

มาจากแอพพลิเคชั่นไฮบริด POV นี่คือตัวอย่างจาวาสคริปต์ฉันมีอัปเดตส่วนท้ายในเมนูหลักของฉัน หากมีการอัปเดต (เช่นหมายเลขเวอร์ชันของฉันภายในไฟล์กำหนดค่าน้อยกว่าเวอร์ชันที่ดึงมาให้แสดงส่วนท้าย) จากนั้นจะนำผู้ใช้ไปที่แอพ / เพลย์สโตร์ซึ่งผู้ใช้สามารถคลิกปุ่มอัปเดตได้

ฉันยังได้รับข้อมูลใหม่คืออะไร (เช่นบันทึกประจำรุ่น) และแสดงข้อมูลเหล่านี้ในรูปแบบการเข้าสู่ระบบหากเป็นครั้งแรกในเวอร์ชันนี้

บนอุปกรณ์พร้อมตั้งค่า URL ร้านค้าของคุณ

        if (device.platform == 'iOS')
           storeURL = 'https://itunes.apple.com/lookup?bundleId=BUNDLEID';
        else
           storeURL = 'https://play.google.com/store/apps/details?id=BUNDLEID';

สามารถเรียกใช้วิธีการอัปเดตได้บ่อยเท่าที่คุณต้องการ ทุ่นระเบิดจะทำงานทุกครั้งที่ผู้ใช้ไปที่หน้าจอหลัก

function isUpdateAvailable() {
    if (device.platform == 'iOS') {
        $.ajax(storeURL, {
            type: "GET",
            cache: false,
            dataType: 'json'
        }).done(function (data) {
            isUpdateAvailable_iOS(data.results[0]);
        }).fail(function (jqXHR, textStatus, errorThrown) {
            commsErrorHandler(jqXHR, textStatus, false);
        });
    } else {
        $.ajax(storeURL, {
            type: "GET",
            cache: false
        }).done(function (data) {
            isUpdateAvailable_Android(data);
        }).fail(function (jqXHR, textStatus, errorThrown) {
            commsErrorHandler(jqXHR, textStatus, false);
        });
    }
}

iOS Callback: Apple มี API ซึ่งง่ายมากที่จะรับ

function isUpdateAvailable_iOS (data) {
    var storeVersion = data.version;
    var releaseNotes = data.releaseNotes;
    // Check store Version Against My App Version ('1.14.3' -> 1143)
    var _storeV = parseInt(storeVersion.replace(/\./g, ''));
    var _appV = parseInt(appVersion.substring(1).replace(/\./g, ''));
    $('#ft-main-menu-btn').off();
    if (_storeV > _appV) {
        // Update Available
        $('#ft-main-menu-btn').text('Update Available');
        $('#ft-main-menu-btn').click(function () {
            openStore();
        });

    } else {
        $('#ft-main-menu-btn').html('&nbsp;');
        // Release Notes
        settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
    }
}

การโทรกลับของ Android: PlayStore คุณต้องขูดเนื่องจากคุณเห็นว่าเวอร์ชันนั้นค่อนข้างง่ายที่จะคว้าและสิ่งใหม่ที่ฉันใช้ html แทนข้อความด้วยวิธีนี้ฉันสามารถใช้การจัดรูปแบบได้ (เช่นบรรทัดใหม่เป็นต้น)

function isUpdateAvailable_Android(data) {
    var html = $(data);
    var storeVersion = html.find('div[itemprop=softwareVersion]').text().trim();
    var releaseNotes = html.find('.whatsnew')[0].innerHTML;
    // Check store Version Against My App Version ('1.14.3' -> 1143)
    var _storeV = parseInt(storeVersion.replace(/\./g, ''));
    var _appV = parseInt(appVersion.substring(1).replace(/\./g, ''));
    $('#ft-main-menu-btn').off();
    if (_storeV > _appV) {
        // Update Available
        $('#ft-main-menu-btn').text('Update Available');
        $('#ft-main-menu-btn').click(function () {
            openStore();
        });

    } else {
        $('#ft-main-menu-btn').html('&nbsp;');
        // Release Notes
        settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
    }
}

ตรรกะเปิดร้านตรงไปตรงมา แต่เพื่อความสมบูรณ์

function openStore() {
    var url = 'https://itunes.apple.com/us/app/appname/idUniqueID';
    if (device.platform != 'iOS')
       url = 'https://play.google.com/store/apps/details?id=appid'
   window.open(url, '_system')
}

ตรวจสอบว่า Play Store และ App Store ได้รับอนุญาตพิเศษ:

  <access origin="https://itunes.apple.com"/>
  <access origin="https://play.google.com"/>

ฉันได้รับข้อผิดพลาด "เกิดข้อผิดพลาดในการแยกวิเคราะห์การตอบสนองของ ajax: SyntaxError: โทเค็นที่ไม่คาดคิด <" เมื่อ ajax get ถูกเรียก คุณช่วยให้ความกระจ่างเกี่ยวกับเรื่องนี้เกิดอะไรขึ้น?
Kapilrc

ios หรือ android? url ของคุณถูกต้องหรือไม่ นำคุณไปแก้ไขหน้าบนเบราว์เซอร์?
tyler_mitchell

5

Firebase Remote Config ดีกว่า

  • อัปเดตแอปพลิเคชันของเราอย่างรวดเร็วและง่ายดายโดยไม่จำเป็นต้องเผยแพร่รุ่นใหม่ไปยังแอป

การใช้งาน Remote Config บน Android

การเพิ่มการพึ่งพาการกำหนดค่าระยะไกล

compile 'com.google.firebase:firebase-config:9.6.0'

เมื่อเสร็จแล้วเราสามารถเข้าถึงอินสแตนซ์ FirebaseRemoteConfig ตลอดทั้งแอปพลิเคชันของเราได้ตามต้องการ:

FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

การดึงค่าการกำหนดค่าระยะไกล

boolean someBoolean = firebaseRemoteConfig.getBoolean("some_boolean");
byte[] someArray = firebaseRemoteConfig.getByteArray("some_array");
double someDouble = firebaseRemoteConfig.getDouble("some_double");
long someLong = firebaseRemoteConfig.getLong("some_long");
String appVersion = firebaseRemoteConfig.getString("appVersion");

ดึงค่าฝั่งเซิร์ฟเวอร์

firebaseRemoteConfig.fetch(cacheExpiration)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        mFirebaseRemoteConfig.activateFetched();
                        // We got our config, let's do something with it!
                        if(appVersion < CurrentVersion){
                           //show update dialog
                        }
                    } else {
                        // Looks like there was a problem getting the config...
                    }
                }
            });

เมื่ออัปโหลดเวอร์ชันใหม่ไปยัง playstore แล้วเราต้องอัปเดตหมายเลขเวอร์ชันภายใน firebase ตอนนี้หากเป็นเวอร์ชันใหม่กล่องโต้ตอบการอัปเดตจะปรากฏขึ้น


5

ข้างในวิธี OnCreate เขียนโค้ดด้านล่าง ..

VersionChecker versionChecker = new VersionChecker();
    try {
        latestVersion = versionChecker.execute().get();
        Toast.makeText(getBaseContext(), latestVersion , Toast.LENGTH_SHORT).show();

    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }

สิ่งนี้ให้แอพเวอร์ชัน play store ของคุณ ..

จากนั้นคุณต้องตรวจสอบเวอร์ชันของแอปด้านล่าง

PackageManager manager = getPackageManager();
    PackageInfo info = null;
    try {
        info = manager.getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    assert info != null;
    version = info.versionName;

หลังจากนั้นคุณสามารถเปรียบเทียบกับเวอร์ชันร้านค้าและตั้งค่าหน้าจออัปเดตของคุณเอง

if(version.equals(latestVersion)){
        Toast.makeText(getBaseContext(), "No Update" , Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(getBaseContext(), "Update" , Toast.LENGTH_SHORT).show();

    }

และเพิ่ม VersionChecker.class ดังต่อไปนี้

public class VersionChecker extends AsyncTask<String, String, String> {

    private String newVersion;

    @Override
    protected String doInBackground(String... params) {

        try {
            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + "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(".hAyfc .htlgb")
                    .get(7)
                    .ownText();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return newVersion;
    }
}

3

ตั้งค่าเซิร์ฟเวอร์ที่แสดง URL HTTP ที่รายงานเวอร์ชันล่าสุดจากนั้นใช้ AlarmManager เพื่อเรียก URL นั้นและดูว่าเวอร์ชันบนอุปกรณ์เหมือนกับเวอร์ชันล่าสุดหรือไม่ หากไม่ปรากฏข้อความหรือการแจ้งเตือนและส่งไปยังตลาดเพื่ออัปเกรด

มีตัวอย่างโค้ดบางส่วน: จะอนุญาตให้ผู้ใช้ตรวจสอบเวอร์ชันล่าสุดจากภายในแอปได้อย่างไร


3

นอกเหนือจากการใช้ JSoup แล้วเรายังสามารถจับคู่รูปแบบเพื่อรับเวอร์ชันแอปจาก playStore ได้อีกด้วย

เพื่อให้ตรงกับรูปแบบล่าสุดจาก google playstore เช่น <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div> อันดับแรกเราต้องจับคู่ลำดับโหนดด้านบนจากนั้นลำดับด้านบนจะได้รับค่าเวอร์ชัน ด้านล่างนี้คือข้อมูลโค้ดสำหรับสิ่งเดียวกัน:

    private String getAppVersion(String patternString, String inputString) {
        try{
            //Create a pattern
            Pattern pattern = Pattern.compile(patternString);
            if (null == pattern) {
                return null;
            }

            //Match the pattern string in provided string
            Matcher matcher = pattern.matcher(inputString);
            if (null != matcher && matcher.find()) {
                return matcher.group(1);
            }

        }catch (PatternSyntaxException ex) {

            ex.printStackTrace();
        }

        return null;
    }


    private String getPlayStoreAppVersion(String appUrlString) {
        final String currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>";
        final String appVersion_PatternSeq = "htlgb\">([^<]*)</s";
        String playStoreAppVersion = null;

        BufferedReader inReader = null;
        URLConnection uc = null;
        StringBuilder urlData = new StringBuilder();

        final URL url = new URL(appUrlString);
        uc = url.openConnection();
        if(uc == null) {
           return null;
        }
        uc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
        inReader = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        if (null != inReader) {
            String str = "";
            while ((str = inReader.readLine()) != null) {
                           urlData.append(str);
            }
        }

        // Get the current version pattern sequence 
        String versionString = getAppVersion (currentVersion_PatternSeq, urlData.toString());
        if(null == versionString){ 
            return null;
        }else{
            // get version from "htlgb">X.X.X</span>
            playStoreAppVersion = getAppVersion (appVersion_PatternSeq, versionString);
        }

        return playStoreAppVersion;
    }

ฉันได้รับการแก้ไขแล้วเนื่องจากสิ่งนี้ใช้ได้กับการเปลี่ยนแปลงล่าสุดของ Google playstore ด้วย หวังว่าจะช่วยได้


3
private void CheckUPdate() {
    VersionChecker versionChecker = new VersionChecker();
    try
    {   String appVersionName = BuildConfig.VERSION_NAME;
        String mLatestVersionName = versionChecker.execute().get();
        if(!appVersionName.equals(mLatestVersionName)){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity.this);
            alertDialog.setTitle("Please update your app");
            alertDialog.setMessage("This app version is no longer supported. Please update your app from the Play Store.");
            alertDialog.setPositiveButton("UPDATE NOW", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    final String appPackageName = getPackageName();
                    try {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                    } catch (android.content.ActivityNotFoundException anfe) {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
                    }
                }
            });
            alertDialog.show();
        }

    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}

@SuppressLint("StaticFieldLeak")
public class VersionChecker extends AsyncTask<String, String, String> {
    private String newVersion;
    @Override
    protected String doInBackground(String... params) {

        try {
            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id="+getPackageName())
                    .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();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;
    }
}

โปรดให้ข้อมูลเกี่ยวกับวิธีการและการทำงานของรหัสนี้
DarkSuniuM

2

ไม่มี GooglePlay API อย่างเป็นทางการที่จะทำ

แต่คุณสามารถใช้ไลบรารีที่ไม่เป็นทางการนี้เพื่อรับข้อมูลเวอร์ชันของแอป

และหากข้างต้นไม่ได้ผลสำหรับคุณคุณสามารถ http เชื่อมต่อกับหน้าแอพของคุณได้ตลอดเวลา (เช่นhttps://play.google.com/store/apps/details?id=com.shots.android&hl=th ) และ แยกวิเคราะห์ฟิลด์ "เวอร์ชันปัจจุบัน"


1
lib นี้มาจากปี 2011 และเสียนานมาแล้ว
zyamys

2

คุณสามารถลองใช้รหัสต่อไปนี้โดยใช้ Jsoup

String latestVersion = doc.getElementsContainingOwnText("Current Version").parents().first().getAllElements().last().text();

2

ป้อนคำอธิบายภาพที่นี่Google เปิดตัว API การอัปเดตในแอป โดยใช้เราสามารถขอให้ผู้ใช้อัปเดตแอปภายในแอปพลิเคชัน หากผู้ใช้ยอมรับเราสามารถดาวน์โหลดแอพล่าสุดและติดตั้งได้โดยตรงโดยไม่ต้องเปลี่ยนเส้นทางไปที่ playstore สำหรับรายละเอียดเพิ่มเติมโปรดดูลิงค์ด้านล่าง

ลิงค์ 1 ลิงค์ 2


ฉันชอบ GIF ที่คุณสร้าง :)
Hunter

1

ยืนยันว่าวิธีนี้ใช้ได้ผลแล้ว:

newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + AcMainPage.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(5)
                        .ownText();

1

Google เปิดตัวคุณลักษณะการอัปเดตในแอป ( https://developer.android.com/guide/app-bundle/in-app-updates ) ทำงานบน Lollipop + และช่วยให้คุณสามารถขอให้ผู้ใช้อัปเดตได้อย่างดี ไดอะล็อก (FLEXIBLE) หรือด้วยข้อความบังคับแบบเต็มหน้าจอ (ทันที)

การอัปเดตแบบยืดหยุ่นจะมีลักษณะดังนี้: ป้อนคำอธิบายภาพที่นี่

และนี่คือขั้นตอนการอัปเดตทันที: ป้อนคำอธิบายภาพที่นี่

คุณสามารถตรวจสอบคำตอบของฉันได้ที่นี่https://stackoverflow.com/a/56808529/5502121เพื่อรับโค้ดตัวอย่างที่สมบูรณ์ของการใช้โฟลว์การอัปเดตแบบยืดหยุ่นและแบบทันที หวังว่าจะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.