百度的移动端产品,有一点体验做的非常好。比如你手机里面新装了百度云和百度贴吧,现在登录百度云,再打开百度贴吧,会发现虽然之前你从没登录过贴吧,但这时候竟然用你登录百度云的账号自动登录了,省去了你再去登录的步骤。这里有两个关键点,一是,百度的账号是全平台打通的,你的百度云账号和贴吧账号是同一个;二是,iOS平台的百度云和贴吧两个App之间进行了用户数据共享。第一点不说了,百度的事,跟我们没关系。想讨论的是第二点,我们知道iOS上,利用沙盒机制,App之间是互相隔离的,这保证了安全性,但也很封闭。那如何能实现,在这样的封闭环境下“翻墙”去连接别的App的数据呢?iOS也考虑到了这点,提供了Keychain!
iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等。它是一个在所有app之外的sqlite数据库。
Keychain的特点
- Keychain会对保存在其中的数据进行加密(但可能也不绝对安全,越狱手机或许能拿到其中数据);
- Keychain是存在与沙盒之外的,当应用删除之后,app存储的数据并没有被删掉,第二次安装时只要读取Keychain里的数据,即可得到以前存储的信息;
- 相同Team Id的App可以通过Keychain来共享数据
- 获取设备唯一标识目前最佳的办法是IDFV+Keychain组合。IDFV是设备区别应用提供商的,可以作为应用唯一标示符。但是IDFV缺陷就是当设备删除了该所有应用提供商的app之后,IDFV值会发生变化。利用Keychain上面的第2个特点可以解决这个问题。
看到Keychain的第三个特点,也就清楚iOS上如何实现App间的数据共享了。当然了,为了安全考虑,还是有些限制。