iphone - معرف تطبيق الوصول بادئة برمجيا




3 Answers

يمكنك برمجيا استرجاع معرف حزمة الباقة من خلال النظر إلى سمة مجموعة الوصول (أي kSecAttrAccessGroup ) لعنصر KeyChain موجود. في الكود أدناه ، ابحث عن إدخال KeyChain موجود وقمت بإنشاء واحد إذا لم يكن موجودًا. بمجرد الحصول على إدخال KeyChain ، أقوم بإستخراج معلومات مجموعة الوصول منه وإرجاع أول مكون لمجموعة الوصول مفصولة بـ "." (الفترة) كمعرف بذور الحزمة.

+ (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;
}

كيف يمكنني الوصول إلى سلسلة Prefix Seed ID / معرف الفريق / معرف معرّف التطبيق برمجيًا؟ (هذه هي نفس الشيء بقدر ما أستطيع أن أقول).

أنا أستخدم المجمع سلسلة المفاتيح UICKeychainStore لاستمرار البيانات عبر عدة تطبيقات. يحتوي كل تطبيق من هذه التطبيقات على مجموعة مشتركة للوصول إلى keychain في قوائم الاستحقاقات الخاصة بهم ، ومشاركة ملف تعريف التوفير نفسه. بشكل افتراضي ، تستخدم خدمات keychain مجموعة الوصول الأولى في المخطط مثل مجموعة الوصول لحفظ البيانات. يبدو هذا مثل "AS234SDG.com.myCompany.SpecificApp" عند تصحيح UICKeychainStore. أود تعيين مجموعة الوصول إلى "AS234SDG.com.myCompany.SharedStuff" ، ولكن لا يمكنني تحديد كيفية الحصول على سلسلة "AS234SDG" من مجموعة الوصول برمجيًا ، وتريد تجنب ترميزها اذا كان ممكنا.




في swift3: (بناءً على حلHiron)

ببساطة سطر واحد:

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

بالنظر إلى ذلك في Info.plist ، أضف خاصية القيمة الرئيسية التالية:

المفتاح: AppIdentifierPrefix

قيمة السلسلة: $ (AppIdentifierPrefix)




في ما يلي إصدار 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? Dictionary<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
        }
    }



Related

iphone objective-c ios cocoa-touch ipad