我正在通过 iPhone 5s 上的调试器运行 iOS 应用程序。我正在使用钥匙串来存储密码(我正在使用 Apple 的 KeychainItemWrapper 示例来存储和检索我的钥匙串项目)。大约 99.99% 的时间,钥匙串检索工作完美。但是,有两种情况我的应用程序无法获取密码。例如,有一次,我的手机遇到内存压力,我不得不重新启动手机并重新启动应用程序。应用程序重新启动后,我的应用程序无法再从钥匙串中检索密码。请问这个密码丢失是不是内存压力导致的?iOS 清除钥匙串数据的其他情况有哪些?有什么办法可以介绍这个吗??
为了在应用程序之间共享密钥链信息,我们需要设置共享密钥链访问组.在共享正常工作之前,两个应用程序都需要基于相同的捆绑种子ID进行配置.我想知道什么是种子ID与app id相同或不同?
两个共享钥匙串信息我的两个应用程序应该在appstore上.因为我只是制作一个示例项目来检查钥匙串信息的共享.是否可以在不将其发布到Appstore的情况下执行此操作?
注意: - 我的软件包ID只是"com.comapny_name.myapp",在Itunes connect中我只能看到我的应用程序ID - (10位数字)和软件包ID,它与我上面提到的相同.
我encrypted-core-data用来加密所有持久化的数据,以前很简单CoreData.persistentStoreCoordinator创建代码如下.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *oldStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"VistaJetApp.sqlite"];
NSURL *newStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"VistaJet.sqlite"];
NSError *error = nil;
NSString *currentPassword = [[VJAesCryptoWrapper getInstance] getCurrentPassword];
NSDictionary *options = [self getEncryptedStoreOptionsWithPassword:currentPassword andDatabaseStore:newStoreURL];
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
//if old store not exists , it means fresh installation
if([[NSFileManager defaultManager] fileExistsAtPath:oldStoreURL.path] == NO) {
if (![_persistentStoreCoordinator addPersistentStoreWithType:EncryptedStoreType configuration:nil URL:newStoreURL options:options error: &error]) {
}
} …Run Code Online (Sandbox Code Playgroud) app-store core-data-migration nspersistentstore keychainitemwrapper encrypted-core-data-sql
我有一个 iOS 项目。
我今天提取了一些身份验证代码并将其移至它自己的项目中。
该项目支持 macOS 和 iOS。
我创建了一个包含 iOS 项目和 Auth 项目的工作区,并且我已通过面板将 auth 添加.framework到我的 iOS 项目中Frameworks, Libraries, and Embedded Content。
我可以构建和使用我的服务。我还设置了一个自定义方案CI_iOS,允许我为这些项目运行测试。
我现在已经在我的身份验证模块中添加了一些集成测试,这样我就可以KeychainTokenStore根据真正的钥匙串测试我的类。
这些在针对 macOS 测试我的模块时有效,但是尝试在 iOS 模拟器上运行它们时,它们都失败了。
我可以看到,当尝试与钥匙串交互时,会返回一个错误代码-34018,我相信这表明了这一点errSecMissingEntitlement。
我读过很多帖子,似乎建议我需要启用钥匙串共享。
然而我似乎无法完成这项工作。
我的KeychainTokenStore样子是这样的
import Foundation
public protocol TokenStore {
typealias DeleteCacheResult = Result<Void, Error>
typealias DeleteCacheCompletion = (DeleteCacheResult) -> Void
typealias InsertCacheResult = Result<Void, Error>
typealias InsertCacheCompletion = (InsertCacheResult) -> Void
typealias RetrieveCacheResult = Result<String?, Error>
typealias …Run Code Online (Sandbox Code Playgroud) 可以钥匙扣使用像NSUserDefaults类固醇?我的意思是,例如,存储NSData在游戏中使用?
我的意图是存储一个NSData基本上是数组或字典表示的元素.
所以问题是:
假设我使用Apple的KeychainItemWrapper类创建了一个包装器.这是kSecValueData在引用NSData对象的钥匙链文档中提到的吗?
如果是这样我可以这样做,对吗?
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myArrayOfDicts];
KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"myID" accessGroup:nil];
[keychain setObject:myData forKey:kSecValueData];
Run Code Online (Sandbox Code Playgroud)
第二个问题:如果是这种情况,NSData可以存储在钥匙串项目上的大小是否有限制?
很长一段时间以来,我一直使用ARC版的KeychainItemWrapper成功阅读和编写私钥匙项.
我现在正在努力将我的iOS应用程序转换为使用共享访问组,以便我的2个应用程序可以访问共享相同应用程序前缀的钥匙串项目.在功能部分,我添加了钥匙串组"MYAPPPREFIX.MYSHAREDACCESSNAME"
我正在使用这些行将我的变量写入钥匙串组:
keychainItemWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:key accessGroup:@"MYAPPPREFIX.MYSHAREDACCESSNAME"];
[keychainItemWrapper setObject:value forKey:(__bridge id)(kSecAttrAccount)]; // store the new value in the keychain
Run Code Online (Sandbox Code Playgroud)
如果将accessGroup指定为nil,则效果很好.但是,如果我指定访问组,我会在调试器日志中遇到以下错误:
断言失败 - [KeychainItemWrapper writeToKeychain],..../KeychainItemWrapper.m:329由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'无法添加Keychain项.'
生成的OSStatus错误代码是-25243,我无法追踪到更多信息.
为了写入共享访问组,我可能还需要做些什么吗?
我想使用 KeychainItemWrapper 将 UUID 保存在钥匙串中,因此我在MyKeychainManager.m中添加以下方法:
#define keychain_idenentify @"com.myapp.bundle1"
+ (void)saveUUID:(NSString *)UUID{
if([MyKeychainManager getUUID].length > 0) {
return;
}
KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc]initWithIdentifier:keychain_idenentify accessGroup:nil];
[keychain setObject:UUID forKey:(__bridge id)kSecAttrLabel];
}
+ (NSString *)getUUID {
KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc]initWithIdentifier:keychain_idenentify accessGroup:nil];
NSString *uuidString = [keychain objectForKey:(__bridge id)kSecAttrLabel];
return uuidString;
}
Run Code Online (Sandbox Code Playgroud)
但是当我将keychain_identify更改为com.otherApp.bundle后,它崩溃了
结果 = SecItemAdd((CFDictionaryRef)[selfdictionaryToSecItemFormat:keychainItemData], NULL); NSAssert( result == noErr, @"无法添加钥匙串项目。" );
错误是错误 - 25299
这是为什么以及如何解决这个问题?我应该选择哪个,例如kSecAttrLabel?我将其更改为kSecAttrService它很有趣,但我不知道是否还有其他潜在的错误。
任何帮助将不胜感激。
我最近安装了iOS 7.1模拟器和新的Xcode 5.1.我的应用程序在iOS 7中运行良好.我正在使用Apple的KeychainItemWrapper类.更新后,它崩溃了以下消息:
*** Assertion failure in -[KeychainItemWrapper writeToKeychain]
Run Code Online (Sandbox Code Playgroud)
特别是在第299行:
NSAssert( result == noErr, @"Couldn't update the Keychain Item." );
Run Code Online (Sandbox Code Playgroud)
听到错误-25300(errSecItemNotFound)
我在我的权利文件中指定了Keychain Access Group.此错误仅发生在iOS 7.1模拟器中,而不是在真正的iPhone或7.0模拟器上.
有谁知道7.1中Keychain的变化?
我想在KeychainItemWrapper中存储bool值,如何存储?
我试过这段代码,但它给了我错误.
[keychain setObject:YES forKey:(__bridge BOOL)kSecAttrIsInvisible];
Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序中保存密码和ID.我下载了
[KeychainItemWrapper][1]
Run Code Online (Sandbox Code Playgroud)
https://developer.apple.com/library/ios/samplecode/GenericKeychain/Introduction/Intro.html
我将用户名/密码保存到钥匙串,如下所示:
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[keychainItem setObject:usernameField.text forKey:(__bridge id)(kSecAttrAccount)];
[keychainItem setObject:passwordField.text forKey:(__bridge id)(kSecValueData)];
Run Code Online (Sandbox Code Playgroud)
然后我检索用户名密码:
NSString *username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
NSString *password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
Run Code Online (Sandbox Code Playgroud)
然后我想自动将它们放在用户名和密码登录框中,如果用户选中了那么记住我:
if ([_rememberMeSwitch isOn]) {
usernameField.text = username;
}
if ([_rememberMeSwitch isOn]) {
passwordField.text = password;
}
Run Code Online (Sandbox Code Playgroud)
这适用于用户名,但密码显然是作为nscfdata保存在钥匙串中,因为当我尝试在passwordField.text中插入密码时,我得到:
[__NSCFData _encodingCantBeStoredInEightBitCFString]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)
我试图做的只是考虑不好的做法还是有一个简单的方法呢?