iOS 应用程序中的 Android 密钥库摘要等效项是什么

What is Android keystore digest equaivalent in iOS apps

在 Android 中,应用程序开发人员使用 keystore 来签署他们的应用程序。他们可以使用一些 Android SDK(例如 PackageManager)来获取 keystore 的摘要。即使在更新后,密钥库摘要对于相同的应用程序也是唯一的。

一些第三方开发人员在他们的第三个 API 中使用此摘要。例如,它在 google 的地图 API 中使用。

现在我想知道 iOS 中是否有类似的东西。这样我们就可以从 iOS SDK 获取它并且它对我的应用程序的所有版本都是唯一的?

您可以创建一个单独的 plist 配置文件来存储您的第 3 方 API 密钥并使用 [辅助函数] 来检索它们。您可以添加 custom runtime flag 来选择调试密钥或发布密钥。您的辅助函数可能如下所示:

func valueForAPIKey(named keyname:String) -> String {
    // Credit to the original source for this technique at
    // http://blog.lazerwalker.com/blog/2014/05/14/handling-private-api-keys-in-open-source-ios-apps
    let filePath = NSBundle.main().path(forResource: "ApiKeys", ofType: "plist")
    let plist = NSDictionary(contentsOfFile:filePath!)
    #if DEBUG
        keyname = "\(keyname)-DEBUG"
    #endif
    let value = plist?.object(forKey: keyname) as! String
    return value
}

来源:http://dev.iachieved.it/iachievedit/using-property-lists-for-api-keys-in-swift-applications/

根据我的研究,我们可以使用 Team ID 作为识别应用签名者的等价物。

团队 ID 是与 iTunes Connect 中的开发团队关联的唯一标识符,使用任何类型的 Apple 帐户(包括组织、个人或企业)发布的每个应用程序都具有这些唯一标识符。

只是我们应该注意到,我们必须从 iOS SDK 中读取它,而不是在 plist 中对其进行硬编码。我使用以下代码:

CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);


NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
                       (__bridge NSString *)kSecClassGenericPassword,
                       (__bridge NSString *)kSecClass,
                       string, 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);

最后 bundleSeedID 包含当前应用程序的 teamID