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
。
在 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
。