• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Simperium iOS:切换帐户或登录现有帐户时数据保留问题

[复制链接]
菜鸟教程小白 发表于 2022-12-13 07:05:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

目前,在我使用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-推荐答案


    根据设计,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/

    回复

    使用道具 举报

    懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关注0

    粉丝2

    帖子830918

    发布主题
    阅读排行 更多
    广告位

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap