75

にあるGestalt()関数CarbonCore/OSUtils.hは、OS X 10.8MountainLionで非推奨になりました。

私はよくこの関数を使用して、実行時にOS Xオペレーティングシステムのバージョンをテストします(以下のおもちゃの例を参照)。

Cocoaアプリケーションで実行時にOSXオペレーティングシステムのバージョンを確認するために他にどのようなAPIを使用できますか?

int main() {
    SInt32 versMaj, versMin, versBugFix;
    Gestalt(gestaltSystemVersionMajor, &versMaj);
    Gestalt(gestaltSystemVersionMinor, &versMin);
    Gestalt(gestaltSystemVersionBugFix, &versBugFix);

    printf("OS X Version: %d.%d.%d\n", versMaj, versMin, versBugFix);
}
4

16 に答える 16

73

OS X 10.10 (および iOS 8.0) では、次のように定義され[[NSProcessInfo processInfo] operatingSystemVersion]た構造体を返す whichを使用できます。NSOperatingSystemVersion

typedef struct {
    NSInteger majorVersion;
    NSInteger minorVersion;
    NSInteger patchVersion;
} NSOperatingSystemVersion;

NSProcessInfoあなたのために比較を行う方法もあります:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

OS X 10.10 以降で利用可能であると文書化されていますが、OS X 10.9 (おそらく 10.9.2 )operatingSystemVersionに存在し、期待どおりに動作することに注意してください。がこれらのセレクターに応答するかどうかをテストして、OS X 10.9 または 10.10 で実行しているかどうかを確認してはならないことを意味します。isOperatingSystemAtLeastVersion:NSProcessInfo

iOS では、これらのメソッドは実質的に iOS 8.0 以降でのみ使用できます。

于 2014-06-02T23:08:39.530 に答える
28

コマンドラインで:

$ sysctl kern.osrelease
kern.osrelease: 12.0.0
$ sysctl kern.osversion
kern.osversion: 12A269

プログラムで:

#include <errno.h>
#include <sys/sysctl.h>

char str[256];
size_t size = sizeof(str);
int ret = sysctlbyname("kern.osrelease", str, &size, NULL, 0);

Darwin バージョンから OS X リリースへ:

17.x.x. macOS 10.13.x High Sierra
16.x.x  macOS 10.12.x Sierra
15.x.x  OS X  10.11.x El Capitan
14.x.x  OS X  10.10.x Yosemite
13.x.x  OS X  10.9.x  Mavericks
12.x.x  OS X  10.8.x  Mountain Lion
11.x.x  OS X  10.7.x  Lion
10.x.x  OS X  10.6.x  Snow Leopard
 9.x.x  OS X  10.5.x  Leopard
 8.x.x  OS X  10.4.x  Tiger
 7.x.x  OS X  10.3.x  Panther
 6.x.x  OS X  10.2.x  Jaguar
 5.x    OS X  10.1.x  Puma

バージョンを取得してテストするためのサンプル:

#include <string.h>
#include <stdio.h>
#include <sys/sysctl.h>

/* kernel version as major minor component*/
struct kern {
    short int version[3];
};

/* return the kernel version */
void GetKernelVersion(struct kern *k) {
   static short int version_[3] = {0};
   if (!version_[0]) {
      // just in case it fails someday
      version_[0] = version_[1] = version_[2] = -1;
      char str[256] = {0};
      size_t size = sizeof(str);
      int ret = sysctlbyname("kern.osrelease", str, &size, NULL, 0);
      if (ret == 0) sscanf(str, "%hd.%hd.%hd", &version_[0], &version_[1], &version_[2]);
    }
    memcpy(k->version, version_, sizeof(version_));
}

/* compare os version with a specific one
0 is equal
negative value if the installed version is less
positive value if the installed version is more
*/
int CompareKernelVersion(short int major, short int minor, short int component) {
    struct kern k;
    GetKernelVersion(&k);
    if ( k.version[0] !=  major) return major - k.version[0];
    if ( k.version[1] !=  minor) return minor - k.version[1];
    if ( k.version[2] !=  component) return component - k.version[2];
    return 0;
}

int main() {
   struct kern kern;
   GetKernelVersion(&kern);
   printf("%hd %hd %hd\n", kern.version[0], kern.version[1], kern.version[2]);

   printf("up: %d %d eq %d %d low %d %d\n",
        CompareKernelVersion(17, 0, 0), CompareKernelVersion(16, 3, 0),
        CompareKernelVersion(17, 3, 0), CompareKernelVersion(17,3,0),
        CompareKernelVersion(17,5,0), CompareKernelVersion(18,3,0));


}

私のマシンでの結果 macOs High Sierra 10.13.2

17 3 0
up: -3 -1 eq 0 0 low 2 1
于 2012-07-28T01:02:31.250 に答える
25

OS のバージョンと正確に対応していませんが、AppKit のさまざまなバージョンを確認するために使用できる NSAppKitVersionNumber 値があります。

if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_7_2) {
    NSLog (@"We are not running on Mountain Lion");
}
于 2012-07-28T00:45:49.220 に答える
20

ココア API があります。クラス NSProcessInfo から OS X バージョン文字列を取得できます。

オペレーティング システムのバージョン文字列を取得するコードは次のとおりです。

NSString * operatingSystemVersionString = [[NSProcessInfo processInfo] operatingSystemVersionString];

NSLog(@"operatingSystemVersionString => %@" , operatingSystemVersionString);

// ===>> バージョン 10.8.2 (ビルド 12C2034) 結果値

非推奨ではありません。

于 2013-06-05T08:44:08.767 に答える
12

サポートする最小バージョンのみを確認する必要がある場合に使用できる kCFCoreFoundationVersionNumber もあります。これには、10.1 までさかのぼって機能し、C、C++、および Objective-C で実行できるという利点があります。

たとえば、10.10 以降を確認するには:

#include <CoreFoundation/CoreFoundation.h>
if (floor(kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_9) {
    printf("On 10.10 or greater.");
}

CoreFoundation (または Foundation) フレームワークとリンクする必要があります。

Swift でもまったく同じように動作します。別の例を次に示します。

import Foundation
if floor(kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_8 {
    println("On 10.9 or greater.")
} else if floor(kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_9 {
    println("On 10.10 or greater.")
}
于 2014-10-24T15:21:51.457 に答える
12

を使用して、オペレーティング システムのメジャー、マイナー、パッチ バージョンを簡単に取得できます。NSOperatingSystemVersion

NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];

NSString* major = [NSString stringWithFormat:@"%d", version.majorVersion];


NSString* minor = [NSString stringWithFormat:@"%d", version.minorVersion];


NSString* patch = [NSString stringWithFormat:@"%d", version.patchVersion];
于 2015-07-27T15:52:35.440 に答える
9

または、もっと簡単に言えば、コードは次のとおりです。

NSDictionary *version = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"];
NSString *productVersion = [version objectForKey:@"ProductVersion"];
NSLog (@"productVersion =========== %@", productVersion);

これが誰かに役立つことを願っています。

于 2013-02-22T15:13:12.143 に答える
8

10.10 および以前のバージョンで実行する必要があるアプリがある場合は、次の解決策があります。

typedef struct {
        NSInteger majorVersion;
        NSInteger minorVersion;
        NSInteger patchVersion;
} MyOperatingSystemVersion;

if ([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) {
    MyOperatingSystemVersion version = ((MyOperatingSystemVersion(*)(id, SEL))objc_msgSend_stret)([NSProcessInfo processInfo], @selector(operatingSystemVersion));
    // do whatever you want with the version struct here
}
else {
    UInt32 systemVersion = 0;
    OSStatus err = Gestalt(gestaltSystemVersion, (SInt32 *) &systemVersion);
    // do whatever you want with the systemVersion as before
}

10.9 でさえ、operatingSystemVersion セレクターに応答しているように見えるので、10.9 のプライベート API だったと思います (ただし、まだ機能します)。

これは、OS X のすべてのバージョンで機能し、文字列の解析やファイル I/O に依存しません。

于 2014-08-12T13:32:45.170 に答える
6

これは私が使用するものです:

NSInteger osxVersion;
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6) {
    //10.6.x or earlier systems
    osxVersion = 106;
    NSLog(@"Mac OSX Snow Leopard");
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_7) {
    /* On a 10.7 - 10.7.x system */
    osxVersion = 107;
    NSLog(@"Mac OSX Lion");
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_8) {
    /* On a 10.8 - 10.8.x system */
    osxVersion = 108;
    NSLog(@"Mac OSX Moutain Lion");
} else {
    /* 10.9 or later system */
    osxVersion = 109;
    NSLog(@"Mac OSX: Mavericks or Later");
}

AppKit リリースノートで推奨されています

アプリがサンドボックス化されている場合、/System/Library/CoreServices/SystemVersion.plist を読み取ることはできません

于 2014-03-06T13:15:49.887 に答える
6

ありますuname(3)

このuname()関数は、現在のシステムを識別する情報のヌル終了文字列を によって参照される構造体に格納しますname

utsname構造体は<sys/utsname.h>ヘッダー ファイルで定義され、次のメンバーが含まれます。

  • sysname- オペレーティング システムの実装の名前。
  • nodename- このマシンのネットワーク名。
  • release - オペレーティング システムのリリース レベル。
  • version - オペレーティング システムのバージョン レベル。
  • machine - マシン ハードウェア プラットフォーム。
于 2012-06-17T16:24:56.637 に答える
5

sysctl今日、macOSで遊んでいるときkern.osproductversionに、実際に現在の OS バージョンが含まれているものを見つけました。Mojave を実行している Mac では、次のようになります。

$ sysctl kern.osproductversion
kern.osproductversion: 10.14.3

もちろん、値はプログラムでも取得できます。

char str[256];
size_t size = sizeof(str);
int ret = sysctlbyname("kern.osproductversion", str, &size, NULL, 0);

xnu カーネル コード ベースへのこのコミットosproductversionは、2018 年半ばに追加された最近の追加であることを示しています。

全体として、私の意見では、プログラムによるCocoa以外の最良のアプローチは、有効な結果が生成されるかどうかを確認し、そうでない場合はこの回答で説明されている手動マッピングkern.osproductversionにフォールバックすることです。kern.osrelease

于 2019-02-01T19:54:34.727 に答える
0

// Swift (マルチプラットフォーム) に 2 セント

#if os(iOS)
import UIKit
#elseif os(OSX)
import Cocoa
#endif



func platform() -> String {
    var systemInfo = utsname()
    uname(&systemInfo)
    let size = Int(_SYS_NAMELEN) // is 32, but posix AND its init is 256....
    
    let s = withUnsafeMutablePointer(to: &systemInfo.machine) {p in
        //    let s = withUnsafeMutablePointer(to: &systemInfo.nodename) {p in
        
        p.withMemoryRebound(to: CChar.self, capacity: size, {p2 in
            return String(cString: p2)
        })
        
    }
    return s
}



func AppName()->String{
    let bund = Bundle.main
    if let displayName = bund.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String {
        if displayName.count>0{
            return displayName
        }
    }
    
    if let name = bund.object(forInfoDictionaryKey: "CFBundleName") as? String {
        return name
    }
    return "no AppName"
}


func buildVers()->String{
    
    let bund = Bundle.main
    let vers = bund.object(forInfoDictionaryKey: "CFBundleVersion") as! String
    return  vers
}


func AppleStoreVers()->String{
    
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "no.vers."
}



#if os(iOS)
func systemVersion()->String{
    let  v = UIDevice.current.systemVersion
    return v
}
#elseif os(OSX)
#endif
于 2020-08-22T17:43:09.183 に答える
0

macOS Catalina 以降のアップデート

20.x.x  macOS 11.X.X  BigSur
19.x.x  macOS 10.15.x Catalina
18.x.x  macOS 10.14.x Mojave
17.x.x  macOS 10.13.x High Sierra
16.x.x  macOS 10.12.x Sierra
15.x.x  OS X  10.11.x El Capitan
14.x.x  OS X  10.10.x Yosemite
13.x.x  OS X  10.9.x  Mavericks
12.x.x  OS X  10.8.x  Mountain Lion
11.x.x  OS X  10.7.x  Lion
10.x.x  OS X  10.6.x  Snow Leopard
 9.x.x  OS X  10.5.x  Leopard
 8.x.x  OS X  10.4.x  Tiger
 7.x.x  OS X  10.3.x  Panther
 6.x.x  OS X  10.2.x  Jaguar
 5.x    OS X  10.1.x  Puma
于 2020-12-06T08:28:28.680 に答える