web-dev-qa-db-ja.com

拡張機能内からメインアプリバンドルを取得する

含まれているアプリのNSBundleをアプリ拡張機能内から取得することは可能ですか?拡張機能の表示名ではなく、メインアプリの表示名を取得したいのですが。

24
Jordan H

+mainBundleメソッドは、拡張機能内から呼び出されたときにアプリのサブフォルダーである「現在のアプリケーション実行可能ファイル」を含むバンドルを返します。

このソリューションでは、バンドルのURLが「appex」で終わる場合に2つのディレクトリレベルを削除します。

Objective-C

NSBundle *bundle = [NSBundle mainBundle];
if ([[bundle.bundleURL pathExtension] isEqualToString:@"appex"]) {
    // Peel off two directory levels - MY_APP.app/PlugIns/MY_APP_EXTENSION.appex
    bundle = [NSBundle bundleWithURL:[[bundle.bundleURL URLByDeletingLastPathComponent] URLByDeletingLastPathComponent]];
}

NSString *appDisplayName = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];

スイフト2.2

var bundle = NSBundle.mainBundle()
if bundle.bundleURL.pathExtension == "appex" {
    // Peel off two directory levels - MY_APP.app/PlugIns/MY_APP_EXTENSION.appex
    bundle = NSBundle(URL: bundle.bundleURL.URLByDeletingLastPathComponent!.URLByDeletingLastPathComponent!)!
}

let appDisplayName = bundle.objectForInfoDictionaryKey("CFBundleDisplayName")

Swift

var bundle = Bundle.main
if bundle.bundleURL.pathExtension == "appex" {
    // Peel off two directory levels - MY_APP.app/PlugIns/MY_APP_EXTENSION.appex
    let url = bundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent()
    if let otherBundle = Bundle(url: url) {
        bundle = otherBundle
    }
}

let appDisplayName = bundle.object(forInfoDictionaryKey: "CFBundleDisplayName")

これは、iOS拡張機能のpathExtensionまたはディレクトリ構造が変更された場合に機能しなくなります。

45
phatblat