菜鸟教程小白 发表于 2022-12-13 07:05:58

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


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