24

これはiOS ユニバーサル フレームワークに限らず、すべての xxx.framework ファイルで発生する可能性があります。ただし、クライアント アプリケーション内のフレームワークの現在のバージョンとビルドを取得する方法に関するドキュメントが見つからないようです。アプリ内では、次のようなものを使用します。

    NSString *name = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

これにより、アプリの Info.plist に保存されている現在の情報が得られます。しかし、フレームワークのその情報をどのように見つけるか。そして私の場合、具体的には組み込みフレームワークです。

4

4 に答える 4

21

Xcode 6 でサポートされている Apple の新しい Cocoa Touch フレームワークが、この問題に対する簡単な解決策を提供することを発見しました。作成されたデフォルトのヘッダー ファイル ( のようなものFramework.h) では、2 つの定数が宣言されています。これらは、おそらく実行時に内部フレームワーク ロジックによって後で定義されます。しかし、それらがフレームワークの plist から引き出されたことを確認しました。

//! Project version number for LocalSearch.
FOUNDATION_EXPORT double FrameworkVersionNumber;

//! Project version string for LocalSearch.
FOUNDATION_EXPORT const unsigned char FrameworkVersionString[];
于 2014-10-13T12:25:44.700 に答える
6

特定のフレームワークのクラスであるとしましょう。次のFooようなものを使用できます。

NSDictionary *infoDictionary = [[NSBundle bundleForClass: [Foo class]] infoDictionary]; 

NSString *name = [infoDictionary valueForKey:(__bridge NSString*)kCFBundleNameKey];
NSString *version = [infoDictionary valueForKey:(__bridge NSString*)kCFBundleVersionKey];

NSLog(@"%@ version %@", name, version);

スウィフトでは:

// `Foo` is a type defined in the framework
if  let infos = Bundle(for: Foo.self).infoDictionary,
    let name = infos[kCFBundleNameKey as String],
    let version = infos[kCFBundleVersionKey as String] {     
        print("Using \(name) version \(version)")

        if let shortVersion = infos["CFBundleShortVersionString"] as? String {
            print("Short version : " + shortVersion)
        }
    }

注: 何らかの理由で、「CFBundleShortVersionString」は定数で定義されていません。cfiOS/MacOS フレームワークで CFBundleShortVersionString に対して定義されている定数はありますか?

于 2016-09-09T13:25:59.047 に答える