应用转移钥匙串丢失:用户注销的解决方案

问题描述

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

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

这确实对我们不利,因为我们在设备中保存了用户创建的数据,这些数据在注销后会丢失。我们也有匿名用户,他们甚至无法重新获得对帐户的访问权限,因为没有可登录的凭据。这对我们来说是不可接受的,因为我们会丢失用户数据,但是我们还需要将应用程序转移到新的开发者帐户...因此,我们正在尝试寻找可能的解决方案。

可能的解决方案#1

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

请保存/备份所有数据和注册(如果您有匿名身份, 帐户),因为所有未保存的数据都会在[今天+ 1 月]。抱歉给您带来不便。

一个月后,我们再次转移到新的开发者帐户。那个月没有看到邮件或没有保存数据,再见数据的用户……太糟糕了。

可能的解决方案#2

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

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

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

因此,我的具体问题是:

  1. 使用Firebase Auth可以实现第二种解决方案吗?
  2. 有人对如何解决这个问题有更多想法吗?我猜想(使用登录名)转移应用程序是一个常见的用例!

我们目前仅使用匿名和电子邮件/密码身份验证方法

谢谢!

解决方法

我认为苹果代表是错的。您的钥匙串与捆绑包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. 我将应用程序转移回了旧的Apple帐户

  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. 已将应用转移到新的Apple帐户

  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. 删除代码,迁移期结束。

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

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

如果将来有人可以更好地解决此问题,请告诉我!!我很好奇。

我希望答案能对某人有所帮助。