バージョン番号の指定
Delphi はプロジェクトオプションでバージョン番号を指定できます。
Android は VersionCode / VersionName を指定できます。
VersionCode は連番で増えていくもので、VersionName は人間が読めるバージョン情報です。
今回は、VersionName を取得します。
画像は各プラットフォーム毎のバージョン番号指定部分を赤枠で示したものです。
左上:Windows
右上:Android
左下:macOS
右下:iOS
バージョン番号を取得する
バージョン情報ダイアログにバージョンを表示するときやサポートにログを送って貰うときにログにバージョンを仕込んでおくとか、そういう時にバージョン情報が必要になります。
ということでプログラムからバージョン番号を取得する部分を関数にしました。
ソースは以下の通りです。
(*
* Application Version
*
* PLATFORMS
* Windows / macOS / iOS / Android
*
* LICENSE
* Copyright (c) 2022 HOSOKAWA Jun
* Released under the MIT license
* http://opensource.org/licenses/mit-license.php
*
* HISTROY
* 2022/12/19 Version 1.0.0 First Release
*
* Programmed by HOSOKAWA Jun (twitter: @pik)
*)
unit PK.Utils.Version;
interface
function GetVersion: String;
implementation
uses
System.SysUtils
{$IFDEF OSX}
, Macapi.CoreFoundation
{$ENDIF}
{$IFDEF ANDROID}
, Androidapi.Helpers
, Androidapi.JNI.GraphicsContentViewText
, Androidapi.JNI.JavaTypes
, Androidapi.JNI.App
, Androidapi.NativeActivity
{$ENDIF}
{$IFDEF IOS}
, Macapi.Helpers
, iOSapi.Foundation
{$ENDIF}
;
function GetVersion: String;
begin
Result := 'unknown';
{$IFDEF MSWINDOWS}
var Major, Minor, Build: Cardinal;
if GetProductVersion(ParamStr(0), Major, Minor, Build) then
Result := Format('%d.%d.%d', [Major, Minor, Build]);
{$ENDIF}
{$IFDEF OSX}
var CFStr: CFStringRef :=
CFBundleGetValueForInfoDictionaryKey(
CFBundleGetMainBundle,
kCFBundleVersionKey
);
var Range: CFRange;
Range.location := 0;
Range.length := CFStringGetLength(CFStr);
SetLength(Result, Range.length);
CFStringGetCharacters(CFStr, Range, PChar(Result));
Result := Result.Trim;
{$ENDIF}
{$IFDEF IOS}
var Ver :=
TNSBundle
.Wrap(TNSBundle.OCClass.mainBundle)
.infoDictionary
.objectForKey(StringToID('CFBundleVersion'));
if Ver <> nil then
Result := NSStrToStr(TNSString.Wrap(Ver));
{$ENDIF}
{$IFDEF ANDROID}
var Activity :=
TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz);
var Info :=
Activity.getPackageManager.getPackageInfo(Activity.getPackageName, 0);
Result := JStringToString(Info.versionName);
{$ENDIF}
end;
end.
さいごに
GetProductVersion で全部のプラットフォームサポートしてくれたら良くない!?