苹果应用主体迁移记录
关于 App 转移可以先看下苹果的这个官方文档,对总体的迁移流程有个底 Overview of app transfer。
前期准备
确认App符合转让资格
在商店对应应用后台,查看「App 信息 → 转让 App」,出现如下界面,来查看转让 App 需要的前置条件。官方文档在这里 App transfer criteria

大部分 App 基本上都是卡在了 TestFlight Beta 这步了,常见的问题
TestFlight 构建版本移除只需要将构建版本置为已过期就好了。
将测试员和测试群组移除,在已删除的测试员里能看到人,不影响 Transfer App。

沙盒测试员的移除,不确定这个有没有影响,如果别的地方都没有问题,可以考虑删除这里的沙盒测试员。
清理测试信息的时候,要注意如果你有多个本地化版本的话,需要将所有本地化版本都删掉。可以参考这里:Can't transfer app due to TestFlight
迁移 App 这里可能是由于缓存的问题,我把所有清空完成之后再次进入是否支持转让页面时,依然提示“TestFlight Beta 版测试”选项没有通过。我退出登录,然后清除了一下缓存,再次进入发现一切都已经ok了。
我自己遇到的 CASE 比较诡异,上面这些我都做了,但是还是卡在 TestFlight,很奇怪,我尝试在后台新建了一个待提交的版本如图(只新建不提交任何构建版本),然后刷新了下转移界面发现 TestFlight 那一栏不卡了… 很神奇,误打误撞找到了方案

等所有条件都满足好之后,转移方就准备好开始进行转移了。
必须使用转让方的账户持有者进行转让操作。
确认接收方资格
必须使用接收方的苹果账户持有者(Account Holder)来进行接收。
迁移流程
初始化迁移流程的官方文档在这里 Initiate an app transfer。
备份信息
备份最基本的信息。
参考这里,Note: Because an app is removed from your account after an app transfer, you should back up all information about the app for your records. It’s a good idea to keep a record of your appʼs metadata and pricing, note dates the app was available on the App Store, and save sales and download information.
开始转让
之前的前置条件都满足之后,可以开始发起转让流程,需要填写接收方帐户持有人的 Apple ID 以及团队 ID。

接收方的团队 ID 在苹果开发者后台的会员资格详细信息区里查看
填写无误之后,点击继续进入,协议同意页面,确认转让方和接收方的主体是否正确,是否是待转让的应用,没问题的话,在页面底部勾选同意协议条款,并点击「请求转让」按钮。

之后被转让的应用就停留在等待接收方处理的状态,你可以在后台里取消此转让。此时应用还可以正常下载,但是已经不能再后台更改应用的元数据了,比如应用信息,内购条目信息,价格信息等。
同时此时不能再上传新的包了,邮件会提示「ITMS-90748: App is Pending Transfer - Apps can't be submitted while their status is Pending App Transfer.」

至此转让方的工作已经完成了,应用接收方需要在 60 天之内接收,否则被视为放弃。
开始接收
接收流程的官方文档是 Accept an app transfer。
进入苹果商店后台,登录接收方的账户持有人的苹果账户,可以看到如下提示
「App 转让请求正在等待接受转让协议正在等待处理。若要完成 App 转让,你的账户持有人必须查看并接受协议、税务和银行业务中的条款。转让协议自发起日 60 天内有效。60 天内未接受的协议将被取消」
按照提示,我们进入「协议、税务和银行业务」区,点击 App 转让下的「审核」操作。

付费应用或者应用带内购的话,这里的的银行信息等都需要先填好。
进入转让页面里

填好信息之后点击接受,没问题的话就是转移成功了。之前发起转让的账户持有人会收到邮件,内容如下:

然后等个几分钟,登录接收方的 Appstore Connect ,就能在应用里看到转移过来的应用了。转让的过程并不需要苹果审核。
迁移后的一些说明
商店相关
- 内购的项目也会跟着一起带过来。
- 历史的版本发布信息也会带过来。
- 评分以及评论都在。
开发相关
应用迁移过来之后,所有的配置文件(Identifier & Profiles)基本上都需要重新生成一下,有一些和主工程对应的 Identifier 是不会被迁移过来的,比如你主工程 Identifier 是 com.fanthus.xxx 主工程对应有个测试工程 com.fanthus.xxxdebug,则这个 Identifier 是需要转让方删除后,你才能在新主体下创建的,其实就是苹果保证 bundle id 是不同的机制。
分享&Adhoc功能
微信分享是依赖 Universal Links 的,配置 Universal Links 是需要将一个名为 apple-app-site-association 的文件放到指定目录下。问题来了,这个文件里的 bundle id 是带 teamid 前缀的,而变更主体的时候 teamid 也会同步发生变化,所以你需要将这个文件的 teamid 前缀替换为新主体的 teamid。
同理 Adhoc 包导出的时候需要的 ExportOptions.plist 文件同样包含一个 teamid,不替换为新主体的 teamid 的话,是没有办法安装 adhoc 包的。
推送功能
刚迁移完还之后推送还是能用的,我实际测试之后发新版之后就算不更新推送证书也能用(但不确定能持续多久),而且就算后续更新了推送证书,老的版本依然能收到推送,苹果应该是做了一些处理,不过官方文档这里说的不够细致。
官方文档相关描述:用于推送通知的关联客户端 SSL 证书不会转让。如果该 App 采用了“Apple 推送通知服务”(APNs),则接收方需要使用其开发者帐户创建一个客户端 SSL 证书,方可重新启用该服务。
参考地址:
关注我的微信公众号,我在上面会分享我的日常所思所想。

