これはおそらく iOS Universal Frameworks だけでなく、すべての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に保存されている現在の情報が得られます。しかし、フレームワークのためにその情報を見つける方法。そして私の場合、特に組み込みフレームワークです。
Xcode6でサポートされているAppleの新しいCocoaTouchフレームワークは、この問題に対する簡単な答えを提供することがわかりました。 Framework.h
のような、作成されたデフォルトのヘッダーファイルには、2つの定数が宣言されています。これらは、おそらく実行時に内部フレームワークロジックによって後で定義されます。しかし、私はそれらがフレームワークのplistから引き出されていることを確認しました。
//! Project version number for LocalSearch.
FOUNDATION_EXPORT double FrameworkVersionNumber;
//! Project version string for LocalSearch.
FOUNDATION_EXPORT const unsigned char FrameworkVersionString[];
これは、ユニバーサルフレームワークで機能するソリューションです。 SomeFrameworkClass
を目的のフレームワークのクラスに置き換えるだけです。
if let sdkVersion = Bundle(for: SomeFrameworkClass.self).infoDictionary?["CFBundleShortVersionString"] {
// sdkVersion is available here
}
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);
In Swift:
// `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」は定数で定義されていません。cf iOS/MacOSフレームワークでCFBundleShortVersionStringに定義された定数はありますか
これは、ビルド番号が付いたバージョンをコンソールに返すか、コンソールに出力する関数をフレームワークに配置したい場合に使用します。 * infoDictionaryを宣言するときは、Framework.hで共有しているクラスを使用していることを確認してください。私の例では、cloudという名前のクラスを使用しています
+(NSString *)frameWorkVersion {
NSDictionary *infoDictionary = [[NSBundle bundleForClass: [cloud class]] infoDictionary];
NSString *version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
NSString *build = [infoDictionary objectForKey:(NSString *)kCFBundleVersionKey];
NSString *fVersion = [NSString stringWithFormat:@"%@.%@",version,build];
NSLog(@"Framework Version %@",fVersion);
return fVersion; }