web-dev-qa-db-ja.com

プログラムでアプリ識別子プレフィックスにアクセスする

バンドルにアクセスするにはどうすればSeed ID/Team ID/App Identifier Prefix stringをプログラムで使用できますか?.

UICKeychainStoreキーチェーンラッパーを使用して、複数のアプリケーション間でデータを保持しています。これらのアプリケーションはそれぞれ、資格リストに共有キーチェーンアクセスグループを持ち、同じプロビジョニングプロファイルを共有します。デフォルトでは、キーチェーンサービスはデータを保存するアクセスグループとしてplistの最初のアクセスグループを使用します。 UICKeychainStoreをデバッグすると、これは「AS234SDG.com.myCompany.SpecificApp」のようになります。アクセスグループを「AS234SDG.com.myCompany.SharedStuff」に設定したいのですが、プログラムでアクセスグループの「AS234SDG」文字列を取得する方法が見つからないようで、ハードコーディングを避けたい可能なら。

42
Jacob Jennings

Bundle Seed IDを既存のKeyChainアイテムのアクセスグループ属性(つまりkSecAttrAccessGroup)を調べることでプログラムで取得できます。以下のコードでは、既存のKeyChainエントリを作成し、存在しない場合は作成します。KeyChainエントリを取得したら、そこからアクセスグループ情報を抽出し、アクセスグループの最初のコンポーネントを「。」(ピリオド)で区切ってBundle Seed ID。

+ (NSString *)bundleSeedID {
    NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
                           (__bridge NSString *)kSecClassGenericPassword, (__bridge NSString *)kSecClass,
                           @"bundleSeedID", kSecAttrAccount,
                           @"", kSecAttrService,
                           (id)kCFBooleanTrue, kSecReturnAttributes,
                           nil];
    CFDictionaryRef result = nil;
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
    if (status == errSecItemNotFound)
        status = SecItemAdd((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
    if (status != errSecSuccess)
        return nil;
    NSString *accessGroup = [(__bridge NSDictionary *)result objectForKey:(__bridge NSString *)kSecAttrAccessGroup];
    NSArray *components = [accessGroup componentsSeparatedByString:@"."];
    NSString *bundleSeedID = [[components objectEnumerator] nextObject];
    CFRelease(result);
    return bundleSeedID;
}
55
David H

Info.plistには独自の情報を含めることができ、$(AppIdentifierPrefix)を使用して値を記述すると、ビルド段階で実際のアプリ識別子プレフィックスに置き換えられます。

だから、これを試してください:

Info.plistに、アプリIDプレフィックスに関する情報を追加します。

<key>AppIdentifierPrefix</key>
<string>$(AppIdentifierPrefix)</string>

その後、Objective-Cを使用してプログラムで取得できます。

NSString *appIdentifierPrefix =
    [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AppIdentifierPrefix"];

swiftの場合:

let appIdentifierPrefix =
    Bundle.main.infoDictionary!["AppIdentifierPrefix"] as! String

appIdentifierPrefixはピリオドで終わることに注意してください。例えばAS234SDG.

77
Hiron

In Swift3:(@Hironソリューションに基づく)

単純に1行:

var appIdentifierPrefix = Bundle.main.infoDictionary!["AppIdentifierPrefix"] as! String

Info.plistで、次のキー値プロパティを追加します。

キー:AppIdentifierPrefix

文字列値:$(AppIdentifierPrefix)

6

これは良い質問ですが、意図したことを達成するために、Bundle Seed ID。

これから 記事 、使用しているものとほぼ同じキーチェーンラッパー:

デフォルトでは、書き込み時にEntitlements.plistで指定された最初のアクセスグループを選択し、何も指定されていない場合はすべてのアクセスグループを検索します。

キーは、アクセスが許可されているすべてのグループの検索になります。したがって、問題を解決するには、「共有スタッフ」グループを使用する代わりに、すべてのバンドルアプリのアクセスグループをentitlements.plistに追加し、最初のキーチェーングループとして$(CFBundleIdentifier)を追加します(キーチェーンラッパーは、グループ)そして、あなたはすべて設定されています

4
Aurelien Porte

Swift @David H回答のバージョン:

static func bundleSeedID() -> String? {
        let queryLoad: [String: AnyObject] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: "bundleSeedID" as AnyObject,
            kSecAttrService as String: "" as AnyObject,
            kSecReturnAttributes as String: kCFBooleanTrue
        ]

        var result : AnyObject?
        var status = withUnsafeMutablePointer(to: &result) {
            SecItemCopyMatching(queryLoad as CFDictionary, UnsafeMutablePointer($0))
        }

        if status == errSecItemNotFound {
            status = withUnsafeMutablePointer(to: &result) {
                SecItemAdd(queryLoad as CFDictionary, UnsafeMutablePointer($0))
            }
        }

        if status == noErr {
            if let resultDict = result as? [String: Any], let accessGroup = resultDict[kSecAttrAccessGroup as String] as? String {
                let components = accessGroup.components(separatedBy: ".")
                return components.first
            }else {
                return nil
            }
        } else {
            print("Error getting bundleSeedID to Keychain")
            return nil
        }
    }
4
balkoth