目前,在我使用Simperium的应用程序中,我正在尝试为用户提供从其同步帐户中注销,使用现有数据登录到同步帐户,切换帐户等时的干净体验。
我要实现的目标如下(欢迎提出建议,如果这没有任何意义):
注销同步帐户时,我不想在本地删除任何内容,因此用户可以继续使用数据(这也很重要,因为同步是一项高级功能,用户可能会取消它)。 创建新的同步帐户(显然不包含任何数据)时,我想保留本地数据并将其同步到新帐户(如果有人开始使用未同步的应用程序,然后稍后激活同步,这是有意义的)。 但是,当使用现有数据登录到现有同步帐户时,我需要防止在本地数据与远程数据之间合并 hell (想象有人要切换帐户!)。我认为用远程数据完全覆盖本地数据是最有意义的。 Simperium似乎并不直接支持我的方法,而只是提供注销后删除数据的功能。在尝试使Simperium满足我的需求时,我目前面临两个问题/问题: 删除所有本地数据(包括所有Simperium元数据,包括用户默认设置中的数据)的首选方法是什么?注意:我需要在用户未登录Simperium时执行此操作,所以我不能使用signOutAndRemoveLocalData:YES 。我想我需要做一些类似[self.buckets.allValues makeObjectsPerformSelectorselector(deleteAllObjects)]; 的事情(在退出完成处理程序中完成),但是我找不到为此的任何 public 接口。是否可以保存直接通过CoreData删除所有对象的信息,还是将任何东西留在用户默认值中,例如稍后会导致问题的信息? 我注意到Simperium在注销后仍保留其幻影数据。登录另一个帐户(在我的情况下为新帐户)时,这会导致大量问题,因为它不会将对象视为要同步的新对象,而是删除了所有本地对象(大概是因为它无法在本地对象上找到它)远程)! 这真的是预期的行为吗?我希望Simperium在注销后摆脱所有同步元数据,即使数据本身没有被删除。对于幻影数据更是如此,因为该数据直接绑定到同步帐户-它代表对象的远程状态,因此我认为退出后不再存在远程状态(因为存在没有“远程”)。 无论如何,对我来说,重影数据重置回初始干净状态的最佳方法是什么(也可能是{ "key" : "...", "version" : "0" } 之类的东西)?我可以手动执行此操作,但这感觉像在严重干扰Simperium的内部。 抱歉,这个冗长的问题。非常感谢任何帮助/指针,谢谢!
更新/澄清
我的目标实际上并不是要将数据从一个帐户转移到另一个帐户。实际上,正如我所说,我的计划是在登录到现有的帐户之前删除所有本地数据,这样可以防止出现重复等问题-客户端只是完全丢弃其本地状态,而是使用当前存储在远程同步帐户中的任何内容。保留的幻影数据导致我出现问题的唯一情况是: 应用程序当前正在与帐户A同步。用户从帐户A注销(使用signOutAndRemoveLocalData:NO completion: )。 用户愉快地继续使用该应用程序(可能会持续一段时间)用户创建一个新的同步帐户B(即,该服务器上不包含任何数据的同步帐户)。现在,采用默认行为,Simperium将删除所有包含版本> 0的幻影数据的本地对象(但会保留未登录任何同步帐户而已创建的所有对象,从而使数据库处于潜在的无效状态,状态为:关系破裂等)。 我只是不认为这是用户期望的行为,并且我相信这会导致许多支持查询...
我的身份验证流程看起来完全像您建议的那样:我有自己的后端,用于管理订阅并通过Simperium Auth API生成auth token ,并将其发送给客户端。但是我真的不知道这如何解决我的问题。我完全同意,用户切换同步帐户不是一个常见的用例(尽管情况与邮件帐户有所不同,因为您可以在不同步的情况下使用它),并且我绝对不鼓励用户这样做。我的问题是,即使这种情况很少发生,也不应破坏应用程序。而且我不知道如何阻止用户这样做,因为他们始终可以自由决定退出并再次登录/登录。
您建议采取什么行为来确保良好的用户体验?始终在注销时删除本地数据?
Best Answer-推荐答案 strong>
根据设计,Simperium并不意味着将数据从帐户A 传递到帐户B 。想象一下一个邮件客户端,它将在“注销+登录到另一个帐户”后上载您的收件箱。
正如您所指出的那样,重置内部元数据的首选方法是signOutAndRemoveLocalData 选择器。但是,SPManagedObject的simperiumKey和ghostData保持不变。我们不使用这两个字段的主要原因是,如果您再次登录同一帐户,则不会获得任何重复的实体(lib只会知道它是同一对象)。
因此,实现一种机制来重置SPManagedObject的Simperium元数据字段是一个潜在的坏主意。 不过,如果您想进行测试,则可以遍历要重置的实体,对字段和call this selector进行核对,以便lib本身忽略更改。
此外,如果您想登录其他帐户,则可能会遇到重复的实体问题(也就是说,假设第二个帐户已经上传了对象)。
我想建议这种情况的潜在流程:
在启动时,您的应用程序可以命中this initializer,这样核心数据堆栈就可以工作了。 一旦您的用户准备启用同步,就可以使用this method触发iOS接口,或者可以在自己的后端上实现API,以包装Simperium用户身份验证。
此Helper API可以返回authToken,iOS客户端将使用authToken到hit this method。 如果出于任何原因必须禁用同步,则可以:
A.停止点击“验证”方法,或者
B.根据需要切换this flag。 假设您的iOS应用程序已经具有用户身份验证流程,那么将Simperium Auth调用包装在您自己的后端中将是一个好主意,因为很明显,同步功能已100%与他自己的帐户绑定了。
恐怕将“帐户A”到“帐户B”中的数据继续进行,尽管在技术上是可行的,但这听起来是个坏主意。到目前为止,防止重复的唯一受支持机制依赖于本地和远程具有相同的simperiumKey。而且(据我了解),这种假设在您的情况下将不成立。
希望有帮助!
乔治
关于ios - Simperium iOS:切换帐户或登录现有帐户时数据保留问题,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/30186363/
|