App Transfer Keychain Loss:用户登出解决方案

App Transfer Keychain Loss: Solutions to users logging out

我将一个应用程序转移到了一个新的开发者帐户。当我从新的开发者帐户上传构建并通过 Testflight 部署它时,我遇到了我的用户从应用程序注销的情况。

我认为这是由于钥匙串丢失造成的,因为 Team ID 发生了变化。所以,我联系了 Apple,他们说无法在新的开发者帐户中访问旧的 Keychain,但我可以将应用程序转移回我的旧开发者帐户。

这对我们来说真的很糟糕,因为我们在设备中拥有用户创建的数据,这些数据在注销时丢失了。我们也有匿名用户,他们甚至无法重新访问他们的帐户,因为没有登录凭据。这对我们来说是不可接受的,因为我们会丢失用户数据,但我们还需要将应用程序转移到新的开发者帐户...所以我们正在努力寻找可能的解决方案。

可能的解决方案 #1

远非理想:例如,继续使用旧的开发者帐户一个月,并显示一条警告,内容如下:

Please save/backup all your data and signup (if you have an anonymous account) because all unsaved data will be lost on the [todays date + 1 month] due to a migration. Sorry for the inconvenience.

一个月后,我们再次转入新的开发者账号。当月没有看到消息或没有保存数据的用户,再见数据......太糟糕了。

可能的解决方案#2

我不确定 Firebase Auth iOS SDK 是否具有执行类似操作的 API:

  1. 再次将应用转移回旧的开发者帐户
  2. 从那里上传一个新版本,将 Firebase 身份验证状态(例如令牌)临时保存在一个文件中(我知道它不安全......也许我可以加密它)
  3. 再次将应用转移回新的开发者帐户
  4. 上传一个新版本以检查该文件是否存在,然后再次将 Auth State 复制到 Firebase Auth SDK 中。这样用户仍然登录,就好像什么都没发生一样。

第二种解决方案有点不安全、复杂且难以测试,但从用户的角度来看,它会比第一种解决方案更理想(如果一切顺利的话)。

所以,具体我的问题是:

  1. 解决方案 #2 是否可以通过 Firebase Auth 实现?
  2. 有没有人对如何解决这个问题有更多想法?我想传输应用程序(需要登录)是一个常见的用例!

我们目前仅使用匿名和 Email/Password 身份验证方法。

谢谢!

我认为 Apple 代表错了。您的钥匙串绑定到捆绑包 ID,而不是团队 ID。

假设您将 SomeApp 从原始应用程序所有者 OldCo 转移到 NewCo。该应用程序包括一个自定义键盘、实际的 SomeApp 应用程序和一个应用程序组。您在 developer.apple.com:

上设置了一些标识符
App ID:
   com.OldCo.SomeApp
   com.OldCo.SomeApp.keyboard
App Group ID:
   com.OldCo.SomeAppGroup

如果您将这些更改为以 com.NewCo. 开头,用户将丢失他们的 iCloud 数据。但是,如果您将它们保留为 com.OldCo.,一切都应该很好。请注意,要在 NewCo 的 developer.apple.com 帐户中创建这些 ID,OldCo 必须将它们从其帐户中删除。 NewCo拥有OldCo的ID感觉很奇怪,但生活很奇怪。

如果我遗漏了一些细微差别,即 TeamID 的更改会影响钥匙串,请告诉我,我会做更多研究。

所以,我没有找到理想的解决方案。

我最终混合了解决方案#1 和#2:

  1. 我把应用转移回了旧的苹果账户

  2. 我上传了一个新版本:

     a. extracts keychain data (which has login credentials and other stuff)
    
     b. encrypts this data (I used CryptoSwift)
    
     c. saves it into a file in the documents directory
    
  3. 等待 1-2 个月,以便用户可以打开应用程序执行迁移的第一部分

  4. 在等待的过程中,我们发送电子邮件和推送通知要求用户备份他们的数据,说即将进行大迁移,借口是我们最近“成长”了很多,我们正在扩展东西:P

  5. 已将应用转移到新的苹果帐户

  6. 我上传了一个新版本:

     a. checks if the migration file exists (in the documents directory)
    
     b. if exists, read the migration file and decrypts data
    
     c. puts this data into the keychain (which is empty after app transfer)
    
     d. deletes the migration file from the documents directory
    
  7. 将此迁移代码保留几个月,以便人们打开应用程序并执行迁移

  8. 删除代码,迁移期结束

我将日志发送到后端以查看迁移是否成功。到目前为止,用户都在正确迁移。

在某些情况下,用户可能会丢失他们的数据,例如,当匿名用户没有执行迁移的第一部分时。但我想不出更好的解决方案……到目前为止,数据丢失很少。但我们也花了一些时间来把事情做好并进行所有适当的测试。

如果以后有人对这个问题有更好的解决办法,请告诉我!!我很好奇。

希望回答对大家有所帮助。