53

プログラムでバンドルシードID/チームID/アプリ識別子プレフィックス文字列にアクセスするにはどうすればよいですか?(私が知る限り、これらはすべて同じものです)。

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

4

4 に答える 4

101

Info.plistには独自の情報を含めることができ、値を。で書き込むと$(AppIdentifierPrefix)、ビルドフェーズで実際のアプリ識別子のプレフィックスに置き換えられます。

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

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

<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.

于 2015-02-25T08:57:46.260 に答える
58

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

+ (NSString *)bundleSeedID {
    NSString *tempAccountName = @"bundleSeedID";
    NSDictionary *query = @{
        (__bridge NSString *)kSecClass : (__bridge NSString *)kSecClassGenericPassword,
        (__bridge NSString *)kSecAttrAccount : tempAccountName,
        (__bridge NSString *)kSecAttrService : @"",
        (__bridge NSString *)kSecReturnAttributes: (__bridge NSNumber *)kCFBooleanTrue,
    };
    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;
    }
    status = SecItemDelete((__bridge CFDictionaryRef)query); // remove temp item
    NSDictionary *dict = (__bridge_transfer NSDictionary *)result;
    NSString *accessGroup = dict[(__bridge NSString *)kSecAttrAccessGroup];
    NSArray *components = [accessGroup componentsSeparatedByString:@"."];
    NSString *bundleSeedID = [[components objectEnumerator] nextObject];
    return bundleSeedID;
}
于 2012-08-07T08:22:56.253 に答える
9

@DavidHの回答のSwiftバージョンは次のとおりです。

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
        }
    }
于 2017-10-13T09:49:26.887 に答える
4

これは良い質問ですが、意図したことを達成するために、バンドルシードIDを取得する必要のないソリューションがあった可能性があります。

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

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

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

于 2014-04-03T15:10:25.947 に答える