Recent

Author Topic: [SOLVED] Detect MacOS version  (Read 338 times)

ChrisR

  • Full Member
  • ***
  • Posts: 199
[SOLVED] Detect MacOS version
« on: April 14, 2021, 06:25:19 pm »
Prior to MacOS 11, the code below reported MacOS version correctly. It obviously will not work with MacOS 11, as the "10" is hard coded, but can anyone suggest the recommended backward compatible way to detect MacOS version.

Of reference, on MacOS 11.2.3, this program reports "MacOS: 10.16.3"

program ver;
{$mode objfpc}
uses Dos, sysutils;
//fpc ver.pas; ./ver
begin
   writeln('MacOS: 10.' + IntToStr(Lo(DosVersion) - 4) + '.' + IntToStr(Hi(DosVersion))  );
end.
« Last Edit: April 15, 2021, 12:53:47 pm by ChrisR »

Hansaplast

  • Hero Member
  • *****
  • Posts: 612
  • Tweaking4All.com
    • Tweaking4All
Re: Detect MacOS version
« Reply #1 on: April 14, 2021, 06:37:41 pm »

The way I do it ... and maybe there is a better way ... but here an example project (just a TForm with 2 TLabels).




Don't forget:
- {$modeswitch objectivec1}
- uses CocoaAll


Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2.  
  3.  
  4. {$mode objfpc}{$H+}
  5. {$modeswitch objectivec1}
  6. interface
  7.  
  8.  
  9. uses
  10.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, CocoaAll;
  11.  
  12.  
  13. type
  14.  
  15.  
  16.   { TForm1 }
  17.  
  18.  
  19.   TForm1 = class(TForm)
  20.     Label1: TLabel;
  21.     Label2: TLabel;
  22.     procedure FormCreate(Sender: TObject);
  23.   private
  24.  
  25.  
  26.   public
  27.  
  28.  
  29.   end;
  30.  
  31.  
  32. var
  33.   Form1: TForm1;
  34.  
  35.  
  36. implementation
  37.  
  38.  
  39. {$R *.lfm}
  40.  
  41.  
  42. { TForm1 }
  43.  
  44.  
  45. procedure TForm1.FormCreate(Sender: TObject);
  46. begin
  47.   Label1.Caption :=  NSProcessInfo.ProcessInfo.operatingSystemVersionString.UTF8String;
  48.  
  49.  
  50.   Label2.Caption := IntToStr( NSProcessInfo.ProcessInfo.OperatingSystemVersion.majorVersion ) + '.' +
  51.                     IntToStr( NSProcessInfo.ProcessInfo.OperatingSystemVersion.minorVersion ) + '.' +
  52.                     IntToStr( NSProcessInfo.ProcessInfo.OperatingSystemVersion.patchVersion );
  53. end;
  54.  
  55.  
  56. end.
  57.  
« Last Edit: April 14, 2021, 06:42:59 pm by Hansaplast »

trev

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1428
  • Former Delphi 1-7, 10.2 user
Re: Detect MacOS version
« Reply #2 on: April 15, 2021, 01:34:57 am »
Beware NSProcessInfo.ProcessInfo.OperatingSystemVersion is only available from Yosemite (10.10). Whereas operatingSystemVersionString is available from Jaguar (10.2).

See the Wiki article Accessing macOS System Information.
« Last Edit: April 15, 2021, 02:31:12 am by trev »
Lazarus 2.1 r65061 FPC 3.3.1 r49223 macOS 10.14.6 Xcode 11.3.1
Lazarus 2.1 r65070 FPC 3.3.1 r49223 macOS 11.2.3 aarch64 Xcode 12.4
Lazarus 2.1 r61574 FPC 3.3.1 r42318 FreeBSD 12.1 amd64 VMware VM
Lazarus 2.1 r61574 FPC 3.0.4 Ubuntu 20.04 Parallels VM
Lazarus 2.0.10 FPC 3.2.0 Win10 Parallels VM

Hansaplast

  • Hero Member
  • *****
  • Posts: 612
  • Tweaking4All.com
    • Tweaking4All
Re: Detect MacOS version
« Reply #3 on: April 15, 2021, 12:05:07 pm »
Thanks Trev for the heads up!
I wasn't aware ...

trev

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1428
  • Former Delphi 1-7, 10.2 user
Re: Detect MacOS version
« Reply #4 on: April 15, 2021, 12:18:39 pm »
The final solution which works for Mac OS X 10.0 through macOS 11.2.3:

Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2. {$mode objfpc}{$H+}
  3. {$modeswitch objectivec2}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Dialogs, StdCtrls, ExtCtrls,
  9.   MacOSAll,
  10.   CocoaAll;
  11.  
  12. type
  13.   TForm1 = Class(TForm)
  14.     Memo1: TMemo;
  15.     Button1: TButton;
  16.     procedure Button1Click(Sender: TObject);
  17.   private
  18.   public
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.   counter: Int64;
  24.  
  25. implementation
  26.  
  27. {$R *.lfm}
  28.  
  29. { TForm1 }
  30. procedure ProcessInfo;
  31. begin
  32.     Form1.Memo1.Lines.Clear;
  33.  
  34.     Form1.Memo1.Lines.Add('macOS version: '
  35.       + IntToStr(NSProcessInfo.ProcessInfo.operatingSystemVersion.majorVersion)
  36.       + '.'
  37.       + IntToStr(NSProcessInfo.ProcessInfo.operatingSystemVersion.minorVersion)
  38.       + '.'
  39.       + IntToStr(NSProcessInfo.ProcessInfo.operatingSystemVersion.patchVersion)
  40.     );
  41. end;
  42.  
  43. Procedure GestaltInfo;
  44. var
  45.     majorVersion: LongInt = 0;
  46.     minorVersion: LongInt = 0;
  47.     patchVersion: LongInt = 0;
  48. begin
  49.     Form1.Memo1.Lines.Clear;
  50.     Form1.Memo1.Lines.Add('Trying another way...');
  51.  
  52.     Gestalt(gestaltSystemVersionMajor, majorVersion);
  53.     Gestalt(gestaltSystemVersionMinor, minorVersion);
  54.     Gestalt(gestaltSystemVersionBugFix, patchVersion);
  55.  
  56.     Form1.Memo1.Lines.Add('macOS vedrsion: ' + IntToStr(majorVersion) + '.' +
  57.       IntToStr(minorVersion) + '.' + IntToStr(patchVersion));
  58. end;
  59.  
  60. procedure TForm1.Button1Click(Sender: TObject);
  61. var
  62.   aSEL : SEL;
  63. begin
  64.   // Check whether OS version responds to this selector
  65.   aSEL := objcselector('operatingSystemVersion');
  66.   if NSProcessInfo.processInfo.respondsToSelector(aSEL) then
  67.     processInfo
  68.   // Fallback to the deprecated Gestalt function
  69.   else
  70.      GestaltInfo;
  71. end;
  72. end.
« Last Edit: April 15, 2021, 12:54:28 pm by trev »
Lazarus 2.1 r65061 FPC 3.3.1 r49223 macOS 10.14.6 Xcode 11.3.1
Lazarus 2.1 r65070 FPC 3.3.1 r49223 macOS 11.2.3 aarch64 Xcode 12.4
Lazarus 2.1 r61574 FPC 3.3.1 r42318 FreeBSD 12.1 amd64 VMware VM
Lazarus 2.1 r61574 FPC 3.0.4 Ubuntu 20.04 Parallels VM
Lazarus 2.0.10 FPC 3.2.0 Win10 Parallels VM

ChrisR

  • Full Member
  • ***
  • Posts: 199
Re: [SOLVED] Detect MacOS version
« Reply #5 on: April 15, 2021, 12:55:03 pm »
Sorry I missed the well written wiki page. Thanks for the rapid solution.

 

TinyPortal © 2005-2018