LoginSignup
9
3

More than 1 year has passed since last update.

[Delphi] Windows / macOS / iOS / Android でアプリのバージョン情報を取得する

Last updated at Posted at 2022-12-20

バージョン番号の指定

Delphi はプロジェクトオプションでバージョン番号を指定できます。

Android は VersionCode / VersionName を指定できます。
VersionCode は連番で増えていくもので、VersionName は人間が読めるバージョン情報です。
今回は、VersionName を取得します。

画像は各プラットフォーム毎のバージョン番号指定部分を赤枠で示したものです。

左上:Windows
右上:Android
左下:macOS
右下:iOS
image.png

バージョン番号を取得する

バージョン情報ダイアログにバージョンを表示するときやサポートにログを送って貰うときにログにバージョンを仕込んでおくとか、そういう時にバージョン情報が必要になります。

ということでプログラムからバージョン番号を取得する部分を関数にしました。
ソースは以下の通りです。

(*
 * 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 で全部のプラットフォームサポートしてくれたら良くない!?

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3