用 CloudKit 实现一个私密的小圈子社交软件

7 天前
 andyzhshg

最近在研究 Apple 的 CloudKit ,基本上通读了相关的文档:CloudKitCloudKit Web Service

CloudKit 基本上可以认为是一个支持存储用户私人数据的 NoSQL 数据库,其本身的设计保证了即使是 App 的开发者也无法访问用户的私人数据,可以有效的保护用户的隐私。这使得其非常适用于私人数据的同步,比如记账类,日记类的 App 。

但我的关注点在它的另外一项功能,也就是分享Shared Records,使得可以在用户可控的情况下分享指定的资源(虽然这个分享实操起来比较复杂)。

我的计划是通过分享功能创建一个私密的小圈子社交( Apple 的文档说一个记录只能分享最多 100 人),用户之间可以通过创建分享记录,来查看彼此的信息。

这整个过程,都可以仅基于 Apple 的 CloudKit API 完成!虽然实现起来很复杂,但是开发者可以无需提供自己的网络服务,好处有几个:

  1. 解除用户对开发者的隐私疑虑,开发者看不到用户的数据 [可以通过开源,或者测试 App 是否链接 Apple 之外的外源服务来审计]
  2. 解除用户对服务持续性的疑虑,因为不使用 CloudKit 之外的任何外源服务,所以原则上只要 Apple 不倒闭,或者不关闭 CloudKit ,用户就可以继续使用。

问题:

  1. Apple 生态的封闭性,很少看到在 Apple 生态之外使用 CloudKit 的案例,但是读过CloudKit Web Service文档之后,我认为 CloudKit Web Service 提供的能力是与原生 Apple 平台等价的,可以借助 CloudKit Web Service 实现 Web Apple 甚至是其他平台的原生 App 。要求是用户至少有一个 Apple ID 。
  2. 国内的特殊生态,众所周知,Apple iCloud 在中国是独立的由云上贵州运营的,不可避免的就会有各种问题,我目前测试的是通过 CloudKit Web Service 的授权登录国内账号返回的 token 不可用,但是通过设备 Native 获取的 token (CKFetchWebAuthTokenOperation)又可用;也有人说分享功能在国内不可用(/t/1035315);更别说国区账号和外区账号是否可以 share 更是需要测试。

抛开问题不谈,我觉得理想状态下,这非常适合实现一个类似私密朋友圈的社交软件,三五好友,或者家人之间建立一个小的圈子,分享些照片视频之类的,无需担心被平台窥视(当然,你是你相信 Apple 不会作恶窥视你的信息的前提下)。

大家对这个有什么建议,或者有类似想法或者使用过 CloudKit 踩过什么坑的都可以来分享一下。

2000 次点击
所在节点    奇思妙想
29 条回复
richard1122
7 天前
没有做过 iOS 开发,想请问下这种 Shared Records 可以跨云吗?也就是说云上贵州和 global 的用户能够共同访问同一份 records ?
andyzhshg
7 天前
@richard1122 我还没有测试到这一步,目前看是不乐观。
icestraw
7 天前
我觉得不好,这就不是技术问题。你自己开发了程序,你也是平台啊,就因为你说“你只用 CloudKit”我就相信你不上传数据?作为用户无法证实的话,你数据放在哪其实都一样,大多数用户也不在乎这个。
musi
7 天前
“其本身的设计保证了即使是 App 的开发者也无法访问用户的私人数据,可以有效的保护用户的隐私。”
不理解怎么保证的
你存的数据不是用 app 存的吗? app 都是你开发的你在存之前把数据往云端推一份这做不到吗?
kele999
7 天前
挺好的,支持!感觉很多人需要!
SayHelloHi
6 天前
有没有啥好用的 CloudKit 库推荐 😁
SingeeKing
6 天前
#1 #3 #4 的问题 op 不是直接在帖子里回复过了吗…
icestraw
6 天前
@SingeeKing 他觉得他回复了。实际操作上,用户无法一直抓包检查看开发者是否做了坏事,用户即使抓包了,也无法得知他到底是这时候没传,还是一直没传。用户也没办法单独把这个程序的网络权限给关掉。程序在无网环境其实也无法运行。所以说,他说的只是开发者的角度“理论上”可以这么做。

这从来就不是技术问题,作为开发者本来就应该为程序的隐私背书,也必然是保管隐私的第一责任人。什么技术反而是其次,假设开发者用了“安全”CloudKit ,但是犯了一些代码上的错误,或者错误接入三方 SDK ,导致隐私泄露,这种可能性也是有的,但那也是不行的啊,也不能说“我用 CloudKit 所以我安全”。归根结底,责任人是程序发行商。用户也只会信这个。
leo72638
6 天前
有这些需求不如直接用 iMessage 群组和 iCloud 共享相册
wyd011011daniel
6 天前
@icestraw [可以通过开源,或者测试 App 是否链接 Apple 之外的外源服务来审计] 他不是括号括起来了么。 那肯定表示在这个条件下解除用户对开发者的隐私疑虑。

你说“不能说“我用 CloudKit 所以我安全””

但他说的是可以通过开源,或者测试 App 是否链接 Apple 之外的外源服务来审计后解除用户对开发者的隐私疑虑,他并没有说“我用 CloudKit 所以我安全”。
SingeeKing
6 天前
@icestraw 你说的没错,事实上你提出的问题和现在我对很多开源的端对端加密的程序的怀疑一样,即使开源 + 第三方审计,我也会怀疑,不可能每个版本都去审计,那么有没有可能现行的版本增加了漏洞,或是线上的版本和开源的版本不同,更或者是否面临了公司都不知道的供应链攻击。这确实不是一个技术问题。

但是我觉得,前面几位想表述的问题和你想表述的问题不一样,不然问法不会是那样子的;我更觉得是他们根本没有读完整个帖子,而是看了标题看了开头就直接质疑了
Icecokelulu
6 天前
op 的产品包含个人隐私保护和社交属性,可以看看能不能加强或发散一下这两个属性。
wyd011011daniel
6 天前
@wyd011011daniel

这种安全的体现方式是“ app 不会向除了苹果以外的服务器发送消息 ”这件事情第三方软件审计或者开源 app 都可证明。

但第三方服务器用户无从得知开发者的操作也无法审计。

区别在于提供了证明开发者没有获取数据的方式,用户当然不可能审计无时无刻审计,但有的用户可能会审计,有的用户可能看的懂代码。如果这里有一个人发现有问题并给出证明,那么开发者就身败名裂。

类似的开源软件内审查是否有问题的方式也类似,一方面代码公开 一方面谁都能运行代码并测试是否有异常流量。

我想说明的是 使用 cloudkit 并且通过开源,或者测试 App 是否链接 Apple 之外的外源服务来审计 相对于 开发者使用自己的服务器。是会带来更多的安全性和可审核性。
andyzhshg
6 天前
@SayHelloHi 目前在 Apple 原生平台之外还没有发现特别流行的库,苹果有一个 CloudKit.js ,应该可以用来开发 Web App ,但是也没见到比较有名的应用案例。
如果思路可行,我倒是有计划基于 CloudKit Web Service 封装一个 flutter 的 package ,如果真做出来了会开源出来。
andyzhshg
6 天前
感谢大家的回复 @wyd011011daniel @SingeeKing @icestraw @musi
看来大家对隐私的顾虑都很大,确实通过开源或者外部审计无法打消用户的顾虑,但如果这是一个可行的商业模式,开发者是没有动力来主动破坏这种信任的,就像苹果的所谓隐私保护,也是因为大家相信他不会抛弃自己赖以生存的卖点为前提的。
除了隐私之外,我觉得这个方案的另一个特点被大家忽视了,就是服务的可持续性。为什么小开发者没办法做网盘之类对可持续性要求高的应用,就是大家会担心万一开发者撂挑子不干了,我的数据就没了。采用这种方案可以不恰当的理解为这就是一个单机应用(我甚至在考虑加一个本地存储选项,用户的云端数据在本地都有镜像备份,当然确实会浪费设备的存储空间),并且从第一个版本就提供数据的导出功能。维持一个没有服务端的 App 的成本是远低于维护大规模用户云端服务的成本的。
总之吧,目前也还是构想阶段,只是想了解下大家的想法,集思广益。
wyd011011daniel
6 天前
@andyzhshg 可持续性有个有意思的点 在于开发者不能主动下架 app 然后开发者要持续支付年费。(当然不续费使用过的用户还是可以去下载的)

最好的可持续我想是便捷的导出为可理解的格式。譬如 qq 聊天记录是可以导出为 html 格式的。或者健康心率之类的导出为 json 格式。

这样如果 app 不幸终止服务,用户也可以相对轻松(python 脚本或者第三方工具)导出数据转换到别的平台

当然别的平台也需要有导入手段。
andyzhshg
6 天前
@wyd011011daniel 我觉得支持两种格式就可以,一种是可读性强的格式,比如 PDF 或者 HTML ;一种是结构化的数据,比如 json 或者是直接是一个 sqlite 文件之类的。

不过因为开发者的成本基本只剩开发者年费了,这个成本其实是很低的。
hfl1995
6 天前
这个类型的 app 已经有了, app store 搜:遇见夏天
icestraw
6 天前
@andyzhshg 你说的这个其实就比较像微信小程序,或者 iMessage 里的小插件。完美符合“不存储聊天记录,但是提供额外功能”这一点。甚至不联网。不然,如果你不保存,不拥有聊天记录,只提供额外功能,你完全没必要设计聊天程序本体,承担不必要的责任。

@wyd011011daniel 可以分析一下这个信任链:

1. 开发者开源=>用户可以审计代码
用户会吗?每个用户都审计代码吗?

2. 开发者开源=>用户信任
用户怎么知道,开发者上传到商店的二进制,是开源的代码编译成的二进制?二进制需要签名的,校验哈希都没法用。做 GitHub Actions 自动打包?那先不说可不可行,是不是又引入了一个新的,需要信任的对象呢?

3. 审计
无论什么审计方法,都引入了额外需要信任的对象。而对于终端用户而言,信任的对象越少越好。不然安全性从何而来呢?苹果的 CloudKit 也会用 Azure ,也会用 AWS ,但是苹果没有要求你额外信任这些公司,只是自己承担了责任。


@SingeeKing 我感觉他们很多是想从代码层面证明,这是一个比较 Geek 且可行的想法,但是和现实应用差距很大。
icestraw
6 天前
@SingeeKing 而且他们不可能搞真的端到端加密的,相比加密和隐私,他们承担不起“用户忘记唯一的密钥,数据丢失”的风险。我记得苹果 iOS10 还是 11 的时候搞了个 像那么回事的 端到端加密的钥匙串,一旦密码想不起来,他就给你钥匙串全删掉。估计后来因为太多人忘记密码,被人喷狠了,逻辑就改了很多。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1095180

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX