ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

【UE4 Android】アプリのバージョン情報(VersionCode, VersionName)を設定・取得する方法について

記事作成のリハビリを兼ねて、先日調べた内容をサクッと書いてみる
検証バージョンは UE4.25.0

はじめに

Androidアプリのバージョン情報には整数のVersionCode と 文字列の VersionNameの2つがあります。
VersionCodeはストア上での管理で用いられるものです。そして、過去にストアにアップロードしたVersionCodeとの重複が許されないため、ストアにアップするたびに値を追加する必要があります。
VersionNameはユーザへの表示のみを目的としたもので自由に設定することが可能です(例:1.2.3-beta)

参考:
アプリのバージョニング  |  Android デベロッパー  |  Android Developers
versionCodeとversionNameの 違い | アプリ開発のお勉強! アプリリ

バージョン情報の設定方法について

一般的なAndroid開発の場合は build.gradle という名前のファイルにVersionCode, VersionNameを記述するのですが、UE4を使ったAndroid開発の場合はプロジェクト設定で記述することになります。
f:id:pafuhana1213:20200509161407p:plain

上の赤枠のStore Version が Version Code、下の赤枠のVersion Displayが Version Name にあたります。
(名前合わせたほうが混乱しなかったのでは…)

Store Version Offsetで設定した値は、横にある( )内のCPUをサポートするアプリのStore Version に加算されます。そのため、例えばプロジェクト設定のPlatform - Android にあるBuildカテゴリの設定を以下のようにすると、作成したパッケージ( APK )のVersionCodeは10+1=11になります。
f:id:pafuhana1213:20200509162156p:plain

ここでカンの良い人は ↑↑図のStore Version Offsetの設定は破綻する可能性があることに気づきます!いったい何が問題なのでしょうか…?






はじめに設定した通り、Version Codeは重複が許されません。そのため、armv7 対応版と arm64対応版をそれぞれストアにアップするプロジェクトの場合、 Store Versionを「11」に設定してアップしようとすると armv7 版は VersionCodeの重複が原因で失敗するはずです。

そのため、実際にStore Version Offsetを運用する際は以下のように重複を回避することを考慮する必要があります。ちなみに、 パッケージが1種類だけプロジェクトの場合は Store Version Offsetを 初期値の0から変更する必要はありません。
f:id:pafuhana1213:20200509163248p:plain

バージョン情報の取得方法について

アプリを更新するかしないかの判定など、 アプリ起動中にStoreVersionを知りたいケースが時々あるかと思います。ということで取得方法についてもご紹介。

プロジェクト設定で設定したStoreVersion や VersionNameなどは UAndroidRuntimeSettings で保持されています。そのため、

.h ファイル

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AndroidRuntimeSettings.h"
#include "MyBlueprintFunctionLibrary.generated.h"

/**
 * 
 */
UCLASS()
class BUILD0425_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

	UFUNCTION(BlueprintCallable)
	static int GetStoreVersion();

};

.cpp ファイル

#include "MyBlueprintFunctionLibrary.h"

int UMyBlueprintFunctionLibrary::GetStoreVersion()
{
	return GetMutableDefault<UAndroidRuntimeSettings>()->StoreVersion;
}

.build.cs 以下の内容を追加

PrivateDependencyModuleNames.AddRange(new string[] {"AndroidRuntimeSettings" } );

とすることで、StoreVersionを取得することが可能です。
f:id:pafuhana1213:20200509164548p:plain


VersionCode ではなく、StoreVersionであることに注意です! 繰り返しになりますが、VersionCode は StoreVersion とStore Version Offset を足したものです。そのため、VersionCodeの値が欲しい場合は UAndroidRuntimeSettingsが持つ以下のプロパティの値も取得する必要があります。

// Offset to add to store version for APKs generated for armv7
UPROPERTY(GlobalConfig, EditAnywhere, Category = "APK Packaging", meta = (DisplayName = "Store Version offset (armv7)"))
int32 StoreVersionOffsetArmV7;

// Offset to add to store version for APKs generated for arm64
UPROPERTY(GlobalConfig, EditAnywhere, Category = "APK Packaging", meta = (DisplayName = "Store Version offset (arm64)"))
int32 StoreVersionOffsetArm64;

// Offset to add to store version for APKs generated for x86_64
UPROPERTY(GlobalConfig, EditAnywhere, Category = "APK Packaging", meta = (DisplayName = "Store Version offset (x86_64)"))
int32 StoreVersionOffsetX8664;

おしまい

余談:
In-app updates for games のベータが最近公開されたけども今後はこれが主流になっていくのかしら…?
developers-jp.googleblog.com