如果当前版本<>市场版本,则提示Android App用户更新应用程序

Aak*_*ash 21 java android google-play

可以说我的Android App版本0.1目前已安装在用户的手机上.每次他们启动我的应用程序时,我想检查Android Market中是否有可用的其他版本,让我们说这个版本是0.2.如果这两个版本之间存在不匹配,我想显示一个对话框,提示用户升级应用程序.

我完全理解从Android Market本身到用户存在通知程序,但就我的Google Analytics数据而言,提醒用户升级到新版本的App并不是非常有效.

任何见解都会非常有帮助.谢谢StackOverflowers,你们摇滚!

Yah*_*hel 16

Android Market是一个封闭的系统,只有一个非官方的api,可能在任何时候都会中断.

您最好的选择就是在您的Web服务器上托管文件(xml,json或简单文本),您只需在市场上发布该应用程序时即可更新当前版本的应用程序.

您的应用程序将只需要在启动时获取该文件,检查当前安装的应用程序是否具有较低的版本号,并显示一个对话框以警告用户他是否滞后.


Kir*_*zin 16

从2019年起,更新应用程序的最佳方法是使用Play Core库(1.5.0+)提供的应用程序内更新。它适用于棒棒糖及更高版本,但公平地说,Kit-Kat到今天还不到7%,很快将永远消失。您可以在Kit-Kat上安全地运行此代码,而无需进行版本检查,它不会崩溃。

官方文档:https : //developer.android.com/guide/app-bundle/in-app-updates

应用内更新有两种类型:灵活更新和即时更新

Flexible将在对话框窗口中很好地询问您: 在此处输入图片说明

而“ 即时”将要求您更新该应用,以便继续以全屏消息使用它(可以关闭此页面):

在此处输入图片说明

重要提示:目前,您无法在Developer Play Console的“应用程序发行”部分中选择要发布的更新类型。但是显然,他们很快就会给我们这个选择。根据我的测试,目前,我们可以在中使用这两种类型onSuccessListener

因此,让我们在代码中实现这两种类型。

在模块中build.gradle添加以下依赖项:

dependencies {
    implementation 'com.google.android.play:core:1.6.1'//for new version updater
}
Run Code Online (Sandbox Code Playgroud)

MainActivity.class

private static final int REQ_CODE_VERSION_UPDATE = 530;
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

   checkForAppUpdate();
}

@Override
protected void onResume() {
    super.onResume();
    checkNewAppVersionState();
}

@Override
public void onActivityResult(int requestCode, final int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    switch (requestCode) {

        case REQ_CODE_VERSION_UPDATE:
            if (resultCode != RESULT_OK) { //RESULT_OK / RESULT_CANCELED / RESULT_IN_APP_UPDATE_FAILED
                L.d("Update flow failed! Result code: " + resultCode);
                // If the update is cancelled or fails,
                // you can request to start the update again.
                unregisterInstallStateUpdListener();
            }

            break;
    }
}

@Override
protected void onDestroy() {
    unregisterInstallStateUpdListener();
    super.onDestroy();
}


private void checkForAppUpdate() {
    // Creates instance of the manager.
    appUpdateManager = AppUpdateManagerFactory.create(AppCustom.getAppContext());

    // Returns an intent object that you use to check for an update.
    Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

    // Create a listener to track request state updates.
    installStateUpdatedListener = new InstallStateUpdatedListener() {
        @Override
        public void onStateUpdate(InstallState installState) {
            // Show module progress, log state, or install the update.
            if (installState.installStatus() == InstallStatus.DOWNLOADED)
                // After the update is downloaded, show a notification
                // and request user confirmation to restart the app.
                popupSnackbarForCompleteUpdateAndUnregister();
        }
    };

    // Checks that the platform will allow the specified type of update.
    appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
            // Request the update.
            if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {

                // Before starting an update, register a listener for updates.
                appUpdateManager.registerListener(installStateUpdatedListener);
                // Start an update.
                startAppUpdateFlexible(appUpdateInfo);
            } else if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) {
                // Start an update.
                startAppUpdateImmediate(appUpdateInfo);
            }
        }
    });
}

private void startAppUpdateImmediate(AppUpdateInfo appUpdateInfo) {
    try {
        appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo,
                AppUpdateType.IMMEDIATE,
                // The current activity making the update request.
                this,
                // Include a request code to later monitor this update request.
                MainActivity.REQ_CODE_VERSION_UPDATE);
    } catch (IntentSender.SendIntentException e) {
        e.printStackTrace();
    }
}

private void startAppUpdateFlexible(AppUpdateInfo appUpdateInfo) {
    try {
        appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo,
                AppUpdateType.FLEXIBLE,
                // The current activity making the update request.
                this,
                // Include a request code to later monitor this update request.
                MainActivity.REQ_CODE_VERSION_UPDATE);
    } catch (IntentSender.SendIntentException e) {
        e.printStackTrace();
        unregisterInstallStateUpdListener();
    }
}

/**
 * Displays the snackbar notification and call to action.
 * Needed only for Flexible app update
 */
private void popupSnackbarForCompleteUpdateAndUnregister() {
    Snackbar snackbar =
            Snackbar.make(drawerLayout, getString(R.string.update_downloaded), Snackbar.LENGTH_INDEFINITE);
    snackbar.setAction(R.string.restart, new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            appUpdateManager.completeUpdate();
        }
    });
    snackbar.setActionTextColor(getResources().getColor(R.color.action_color));
    snackbar.show();

    unregisterInstallStateUpdListener();
}

/**
 * Checks that the update is not stalled during 'onResume()'.
 * However, you should execute this check at all app entry points.
 */
private void checkNewAppVersionState() {
    appUpdateManager
            .getAppUpdateInfo()
            .addOnSuccessListener(
                    appUpdateInfo -> {
                        //FLEXIBLE:
                        // If the update is downloaded but not installed,
                        // notify the user to complete the update.
                        if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
                            popupSnackbarForCompleteUpdateAndUnregister();
                        }

                        //IMMEDIATE:
                        if (appUpdateInfo.updateAvailability()
                                == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
                            // If an in-app update is already running, resume the update.
                            startAppUpdateImmediate(appUpdateInfo);
                        }
                    });

}

/**
 * Needed only for FLEXIBLE update
 */
private void unregisterInstallStateUpdListener() {
    if (appUpdateManager != null && installStateUpdatedListener != null)
        appUpdateManager.unregisterListener(installStateUpdatedListener);
}
Run Code Online (Sandbox Code Playgroud)

我们完成了!

测试。 请阅读文档,以便您了解如何使用Google Play上的测试曲目对其进行正确测试。

长话短说:

  1. 使用发布证书对您的应用进行签名,然后将其上传到Developer Play Console中“应用发布”下的发布轨道之一(alpha / beta /其他自定义封闭轨道)。

  2. 在发布跟踪页面的“管理测试人员”部分中,创建并添加测试人员列表,并确保选中了该复选框!-此步骤是可选的,因为您的开发者帐户电子邮件也是测试人员帐户,您可以将其用于测试。

  3. 在测试人员列表下,您会找到“选择使用的网址”-复制此网址并将其提供给您的测试人员或自行打开。转到该页面并接受命题进行测试。将会有一个指向该应用程序的链接。(您将无法在Play商店中搜索该应用,因此请将其添加为书签)

  4. 通过该链接在您的设备上安装该应用。

  5. build.gradle增量的版本,defaultConfig { versionCode k+1 }另筑签署的apk构建>生成签名套装/ APK ......并把它上传到您发布的轨道。

  6. 等待... 1小时?2小时?或更多,然后才能在轨道上发布。

  7. 清除设备上Play商店应用的缓存。问题在于Play应用会缓存有关已安装应用及其可用更新的详细信息,因此您需要清除缓存。为此,请执行以下两个步骤:

7.1。转到设置>应用> Google PLay Store>存储>清除缓存。

7.2。打开Play商店应用>打开主菜单>我的应用和游戏>,在那里您应该看到您的应用有新更新。

如果您没有看到它,请确保新的更新已在轨道上发布(转到您的书签页面,并使用它来打开Play商店中列出的应用,以查看其中显示了哪个版本)。另外,当更新发布时,您会在Developer Play Console的右上方看到一条通知(响铃图标将带有一个红点)。

希望能帮助到你。

  • 是的,但是这个应用程序更新功能也必须作为现有应用程序的更新来实现。如果用户之前没有更新应用程序,为什么现在要更新呢?仅当用户首次更新到应用程序更新 API 中包含的版本时,才会提示用户更新。 (2认同)
  • 如果用户立即单击退出按钮怎么办?除了用户界面之外,我认为与灵活的没有任何区别。我想根据用户的应用程序版本为他们提供两种类型 (2认同)

lub*_*ben 5

您可以使用的另一个选项是,如果您想避免让后端服务器存储您接受的答案中建议的当前应用版本,则使用Google跟踪代码管理器(GTM).

如果您已经在使用Google AnalyticsSDK,那么您也可以使用GTM.

在GTM中,您可以在应用程序的容器中定义一个值,用于指定最新发布的版本.例如:

{
   "latestAppVersion": 14,
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在应用启动时查询该值,并在有更新版本时显示用户更新对话框提醒.

Container container = TagManager.getInstance(context).openContainer(myContainerId);
long latestVersionCode = container.getLong("latestAppVersion");

// get currently running app version code
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
long versionCode = pInfo.versionCode;

// check if update is needed
if(versionCode < latestVersionCode) {
   // remind user to update his version
}
Run Code Online (Sandbox Code Playgroud)