美文网首页iOSios 知识小集iOS 开发 学习
iOS 开发keychain 使用与多个APP之间共享keych

iOS 开发keychain 使用与多个APP之间共享keych

作者: 火柴大男人 | 来源:发表于2016-07-23 13:09 被阅读5700次


keychain的作用:


keychain,相当于MAC OS中的钥匙串,但在iOS中相对于功能非常简单.在iOS开发中如果写数据到手机沙盒中,但不管是Caches 还是NSUserDefaults 当应用删除时所有数据都会清除.如果你想在应用删除后还保存一些信息在手机里,这时就要用过keychain了.

#import<Security/Security.h> //keychain 管理的类


keychain的使用一(原生):

如果使用apple自带操作有以下四个 (增删改查)方法 C语言的

OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result);

OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result); 

KeyChain中的ItemOSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate);

KeyChain中的ItemOSStatus SecItemDelete(CFDictionaryRef query)

keychain的使用二(三方框架 KeychainItemWrapper):

KeychainItemWrapper  就两个文件(KeychainItemWrapper.h  KeychainItemWrapper.m) 苹果开发者中心可以下载

 下载地址:KeychainItemWrapper 封装好的OC面向对象.但是代码是MRC的,搞起来不方便,所以没有仔细研究.有兴趣的可以自已去研究下功能还是挺多的.


keychain的使用三(三方框架 SFHFKeychainUtils)

下载地址: SFHFKeychainUtils

相对于 KeychainItemWrapper 使用起来很方便 ,而且还是ARC的

如下提供四个方法:

+ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;

+ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error;

+ (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;

+ (BOOL) purgeItemsForServiceName:(NSString *) serviceName error: (NSError **) error;

保存: 

通过.userName serviceName 保存一个密码

self.userName = @"test@qq.com";

self.userPassword = @"1234567890";

self.serviceName = @"space.kylin.www";

NSError *error;

BOOL saved = [SFHFKeychainUtils storeUsername:self.userName andPassword:self.userPassword

forServiceName:self.serviceName updateExisting:YES error:&error];

读取:

通过.userName serviceName 读取一个密码

_label.text = [SFHFKeychainUtils getPasswordForUsername:self.userName andServiceName:self.serviceName error:nil];

删除:

userName serviceName 删除一个密码

[SFHFKeychainUtils deleteItemForUsername:self.userName andServiceName:self.serviceName error:nil];

清空: 

通过一个serviceName清空里面所有数据

[SFHFKeychainUtils purgeItemsForServiceName:self.serviceName error:nil];

通过keychain我们可以做到保存一数据到手机,不管手机是否删除了该应用.或者系统更新了.我们保存的数据都不会丢失



APP之间如何共享keychain数据

以下操作   请在真机上进行调试

之前查看了网上相关的资料,发现并没有完整且简单的方法.有些就文字描述了下,有些配了图.但方法是旧的现在也用不了.搞了半天也没有搞定.后天自已看了苹果的开发文档,苹果开发文档写的也比较简单.并没有一步一步列举出来.结合了之前网上一些资料加入苹果开发文档内容,再通过自己的验证终于成功了!

首先他建一个工程 :saveKeyChain 打开target 

在keychain Groups 里添加你要分享的另一个APP的bundle ID 

格式为 XXXXX.com.kylin610.www.另一个工程名  其中 XXXXX 是的你开发者ID (不是apple ID的登陆名哦) 如:123456RVYVD

实际上当你打开keychain Sharing 里project会多出一下文件

打开一看如下 实现就是一个PLIST文件 这里保存你你需要分享APP的bundle ID 也就是上面keychain Groups 里面的信息.两个地方都可以管理,所以你有多个APP里只要在这里进行设置添加就可以了.

运行工程写入一个密码 1234567890 到keychain里

点击删除与清空后可清除相关内容  点击读取来检查是否删除成功!

如果运行出错如下图:

这是因为你的在keychain groups里填写其它的APP bundle ID格式有误  或者 开发者ID填错了


其它APP怎么使用keychain里面的数据:

首先创建一个工程 getKeyChain 为 :bundle ID为之前工程 keychain Groups 里的添加的当然开发者ID还是同一个

在新工程使用SFHFKeychainUtils 读取和删除 keychain 里面数据

self.userName = @"test@qq.com";

self.serviceName = @"space.kylin.www";

_label.text = [SFHFKeychainUtils getPasswordForUsername:self.userName andServiceName:self.serviceName error:nil];

这里的serviceName ,userName 要与之前保存是一致的

如果要删除可执行

[SFHFKeychainUtils deleteItemForUsername:self.userName andServiceName:self.serviceName error:nil];

读取结果:

新浪微博 @火柴大男人

代码下载地址: keychain  

最新更新代码 兼容 xcode 7打开工程 


相关文章

网友评论

  • Zxj_Coder:没有成功,save成功了,在save工程里面也能读到password,但是get工程中拿不到password,
    SecItemCopyMatching 这个方法返回-25300
    Zxj_Coder:@火柴大男人 嗯嗯,已经解决了,普通未付费apple id也可以,但是需要都打开keychain sharing
    火柴大男人:@Zxj_Coder 必须要有 付费过的开发者账号 且两个工程 是相同的 账号 下创建的才行
  • 私小甲鱼:如果数据是本地创建数据库里的数据呢, 数据比较多,这个能行吗
    火柴大男人:@陌上花开下雨天 keyChain 等于是iOS 一个大保险柜. 所有应用可以在这个放一个小保险柜保存一些重要的信息.这个小保险柜 只能通过身份验证才能打开.
    主要验证两点
    第一步 ..也就是 两个APP 这间建立共享
    第二步 设置共享必须是小保险柜的属于者

    第一步 好说,就是设置 keyChain共享 但不是绝对安全.因为别人可能知你在里面写了什么.也知道你设置的共享.

    第二步 操作是结合第一步的 验证apple ID 开发者账号是与存keyChain 用的apple ID 是同一个.

    keyChain 其实就是 MAC OS 中 钥匙串 都是保存一些 登陆名,密码之类的.当然要安全了.
    沐时:楼主,咨询你一个问题,这个keychain存的数据是存在钥匙串里面,当应用删除的时候也存在,说明他是存在手机公共一个存储空间了?两个app之间为啥只有在建议共享关系情况下才能获取,麻烦能解释下原理嘛?对这一块原理不是很了解,谢谢
    火柴大男人:@私小甲鱼 这个只适合存一些小数据.
  • CoderLS:那个plist是写groupid的 并不是写bundleid 只要所处group一样 ,bundleid可以随意都可以获取到共享的信息
  • 5a14cf98641d:楼主,这个一定要用正式证书打成ipa包通过iTunes装到手机上才能测试么?
  • 美的不像话:并未成功 因为什么?
  • c8a803172a45:Demo有问题吧. getkeychain 里面也要启用share才能取到共享的keychain
    火柴大男人:@小马哥86 共享的keychain都要。取自己程序里存的不用
  • 叶公学堂:您好,这个开发者id是teamid吗?
    我现在使用openudid存储到keychain,但是两次取出来的值都是不一样的。我用的签名文件也是不一样的。
    火柴大男人:@卢灿 是的
    fe76a92fd062:keychain sharing 必须要是同一 item id【同一证书】下的APP才能共享吗?
    火柴大男人:@yesunsong openUDID 每次获取都会变的..你是不是每次读取的时侯都会进行写入..开发者ID 进dev apple里查看
  • 安心做个笨男孩:其他的app使用keychain获取数据,需要配置什么东西吗,在第一个上面保存密码app里面配置keychain组配置好自己的后,是不是还要添加读取的那个app的bundleID
    火柴大男人:@简_言仑 真机才有用,,开发者ID 只有付费了的开者会员才有的. 开发者中心可以看到..
    ae287f8cef3f:@火柴大男人 这个开发者ID指的是什么ID啊,必须真机才有效果吗
    火柴大男人:@安心做个笨男孩 是的,必须要配置需要读取的另一个APP的BUNDLEID 也必须是一个开发者ID才能读取
  • 沉默学飞翔:楼主,你的demo是xcode8写的?
    😓
    火柴大男人:忘记了,上面的方法也需要xcode 8才能进行修改. GITHUB 上代码已经更新 现在可以用XCODE 7打开了,请重新下载
    沉默学飞翔:@火柴大男人 好的,我试试,谢谢啦
    火柴大男人:@沉默学飞翔 xcode 7可以打开 参考http://www.jianshu.com/p/5bc1e8f3600d

本文标题:iOS 开发keychain 使用与多个APP之间共享keych

本文链接:https://www.haomeiwen.com/subject/exqwjttx.html