- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这一切都发生在我的模拟器中。在练习使用钥匙串(keychain)包装时,我发现自己处于一种奇怪的情况。我试图学习如何从钥匙串(keychain)插入和检索数据,为了做到这一点,我开始了一个新项目,其中我所做的唯一一件事就是在 “(void)viewDidLoad” 中写入我的 ViewController 的 方法默认用户名,默认密码,存储并尝试在我的应用程序第二次运行时检索它们.
这本来应该是小菜一碟,但我发现我的应用程序崩溃了。这是我使用的代码:
- (void)viewDidLoad{
[super viewDidLoad];
//Keychain wrapper definition
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
//Getting DATA:
NSLog(@"Retrieving User DATA");
password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
NSLog(@"pwd = %@",password);
NSLog(@"user = %@",username);
//Setting DATA:
[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];
[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];
}
Xcode 给了我一个未捕获的 NSInternalInconsistencyException 。玩弄代码,我意识到只有在设置新密码时(第一次运行我的应用程序或重置钥匙串(keychain)后)才会出现问题,并且奇怪的部分来了,只有当我在用户名之前设置了密码。因此重写代码交换
//Setting DATA
[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];
[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];
}
解决了我的问题。谁能解释一下为什么?
最后,我想问一下,在第二次运行我的应用程序时检索我的密码是否会得到它的加密版本。这是因为我尝试通过两种方式获取密码:
1)存储后我就得到了
//saving DATA
[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];
[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];
//getting DATA:
username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSLog(@"\nUser: %@ \nPassword: %@",username,password);
结果是
User: username you are saving
Password: password you are saving
2)我在第二次运行中获得了密码,将设置部分放在评论下
//saving DATA
//[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];
//[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];
//getting DATA:
username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSLog(@"\nUser: %@ \nPassword: %@",username,password);
结果是
User: username you are saving
Password: <70617373 776f7264 20796f75 20617265 20736176 696e67>
这是我的密码的加密版本还是什么???
谢谢
最佳答案
我不明白为什么在 用户名 之前将 密码 放入钥匙串(keychain)中会使应用程序崩溃,但我了解到,为了获得 从钥匙串(keychain)返回密码,您必须首先将其存储在NSData中,您应该这样做:
NSData *pwd = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
password = [[NSString alloc] initWithData:pwd encoding:NSUTF8StringEncoding];
关于iOS 钥匙串(keychain) :strange behavior while setting and getting data in/out the keychain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20442847/
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 9 年前。 所以我运行了这段代码 String line =
此代码适用于我的网站: $(function(){ $('.link-follow-stop').on('click', function(event){ console.lo
private synchronized Map calculateStanding() { System.out.println("Calculate standing for
下面的程序 (prog1) 抛出 OutOfMemoryError 错误。确实如此。但如果我在第 5 行(prog2)下方添加 sysout,它不会抛出错误。这种奇怪的行为有什么原因吗? 程序1: p
class Foo(object): def __init__(self,x): self.x = x self.is_bar = False def
好的,我有一个设置了高度和宽度的简单 div。前后也设置了高度和宽度。它们都设置为显示为 block ,伪元素的内容为“”。 :before 在内容里面,而不是在它之前。:after 之前有一大堆奇怪
我无法解释 Scala 集合的这种行为。 让我们从一些定义开始。 import scala.collection.mutable.Set case class Item(name: String, c
在阅读我遇到的代码时,结构的以下定义和初始化: // header file struct foo{ char* name; int value; }; //Implementation file s
我正在尝试用 c 操作二进制数。我用下面的最小代码发现了一个奇怪的事情。谁能告诉我“+”和“|”有什么区别这里?谢谢! char next_byte1 = 0b11111111; char next_
我是德尔福的新手。在 TStrem 类的文档中,我读到它是一个抽象类。所以我认为当我尝试使用 创建它时编译器会出错 stream := TStream.Create(); 为什么不呢? 最佳答案 De
我有 2 个简单的表单,Form1 和 Form2 (Delphi 7)。 Form1 打开 Form2,我在那里等待特定的组合键 (Ctrl + F2)。一旦我关闭 Form2 并返回到 Form1
我有很多建立TCP网络的类-使用boost::asio,使用Packet进行传输。 (Packet的基类是std::vector) 我以为我已经解决了所有可能的内存泄漏,但是后来我在关闭客户端之前只是
我对以下声明有一些疑问: SELECT 1 FROM dual WHERE DECODE(1, 0, (SELECT COUNT(*) from tbl
我已经在 symfony 2.1 上安装了最新的 Sonata 管理包,但遇到了以下问题: 配置文件: services: app.geo.admin.city: class: App
我必须输出一系列先前保存在数据库中的随机图像。在输出的那一刻,而不是打印一张图片,代码打印一个奇怪的字符串(meaby dumpfile?): (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(
我刚刚在从 Code Project 下载的项目中看到了这个: base.DialogResult = this.Result != null; 我不认为自己是 C# 新手,但这个对我来说是新手。谁能
看看这个...今天晚上我试图将一些 primiteves 转换到 wrapper 上时发现: Integer i = (Integer)4; Integer i = (Integer)4f; // D
我很少使用 Python,所以我不清楚为什么允许这样的行为:没有 w 对象,因此它没有 s 属性,那为什么 f 允许进行 w.s 赋值? >>> def f(): w.s="ads" #al
在 Jsfiddle 上:http://jsfiddle.net/jhzux/ 我在这个简单的脚本上浪费了很多时间。我想做的是在 jQuery 中启用克隆表单,然后使它们正常工作。 首先,当我在 Js
这是我的代码: .specific_tag_cases a:after{ position: absolute; font-family: Arial; background-
我是一名优秀的程序员,十分优秀!