添加一个新的项目到钥匙串:
NSData *encodedIDentifIEr = [@"BUNDLE_IDENTIFIER" dataUsingEnCoding:NSUTF8StringEnCoding];NSData *encodedPassword = [@"PASSWORD" dataUsingEnCoding:NSUTF8StringEnCoding];// Construct a Keychain itemNSDictionary *keychainItem = [NSDictionary dictionaryWithObjectsAndKeys: kSecclassGenericPassword,kSecclass,encodedIDentifIEr,kSecAttrGeneric,kSecAttrService,@"USERname",kSecAttrAccount,kSecAttrAccessibleWhenUnlocked,kSecAttrAccessible,encodedPassword,kSecValueData nil];// Add item to KeychainOsstatus addItemStatus = SecItemAdd((CFDictionaryRef)keychainItem,NulL);
稍后,将属性kSecAttrAccessible从kSecAttrAccessibleWhenUnlocked更改为kSecAttrAccessibleAfterFirstUnlock:
NSData *encodedIDentifIEr = [@"BUNDLE_IDENTIFIER" dataUsingEnCoding:NSUTF8StringEnCoding];NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: kSecclassGenericPassword,nil];NSDictionary *updatedAttributes = [NSDictionary dictionaryWithObject:kSecAttrAccessibleAfterFirstUnlock forKey:kSecAttrAccessible];Osstatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query,(CFDictionaryRef)updatedAttributes);
这种方法的问题是updateItemStatus总是导致状态errSecUnimplemented。
我认为应该可以更新kSecAttrAccessible的值,因为应用程序的需求改变了。如果一个应用程序在过去没有使用kSecAttrAccessible指定保护类别的情况下,向Keychain添加了十个项目,该怎么办?如果开发人员未明确设置保护类,Keychain将新项目隐式分配值为kSecAttrAccessibleWhenUnlocked的值。之后,开发者需要将保护类更改为kSecAttrAccessibleAfterFirstUnlock,因为应用程序必须在后台访问它(多任务)。开发人员如何才能完成这项工作?
苹果开发者论坛中已经有一个线程,但还没有得到答案:https://devforums.apple.com/thread/87646?tstart=0
解决方法 在Apple开发者技术支持(ADTS)开启支持事件之后,我收到了一个回答这个问题的答复。 SecItemUpdate()通过属性kSecValueData需要Keychain项的数据来执行属性kSecAttrAccessible的更新。根据ADTS,这个约束目前没有记录在参考文献中。NSData *encodedIDentifIEr = [@"BUNDLE_IDENTIFIER" dataUsingEnCoding:NSUTF8StringEnCoding];NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: kSecclassGenericPassword,nil];// Obtain the Keychain item's data via SecItemcopyMatching()NSData *itemData = ...;NSDictionary *updatedAttributes = [NSDictionary dictionaryWithObjectsAndKeys: kSecAttrAccessibleAfterFirstUnlock,(CFDataRef)itemData,kSecValueData,nil];Osstatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query,(CFDictionaryRef)updatedAttributes);// updateItemStatus should have the value errSecSuccess总结
以上是内存溢出为你收集整理的iphone – 是否可以更新Keychain项的kSecAttrAccessible值?全部内容,希望文章能够帮你解决iphone – 是否可以更新Keychain项的kSecAttrAccessible值?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)