CloudKit settings when transferring my App to another account

Recently I am about to transfer my app to another developer account. I checked the official documents to see the preparation I need to make. The most key two things I care are data and subscription. The auto-subscription part is clear and have clear step-by-step instructions. But for the data part, especially I find it was unclear about iCloudKit related service. As a developer I want to keep all user's settings and data when transferring the app. I use CloudKit - CoreData, CloudKit - KV, iCloud Keychain, to save user's preference data, I wonder:

  1. As recipient account, do I need to do anything (like enable some iCloud related features) before accepting a transfer in the aspect of iCloud sharing feature?
  2. I notice that UbiquitousKVStore automatically create a $(TeamIdentifierPrefix)$(CFBundleIdentifier) in my entitlements file. Which means after the transfer, the container's name would change because of TeamID's change. Do I need to change that to use the original TeamID to keep the container's name the same?
  3. As a developer there are actually two stages when transferring an app, "accept a transfer", "publish a new version after accepting a transfer". I wonder when publishing with new account, except for changing the provisioning team file, what others I need to do to ensure that the transferred app has all authority to access "previous service" (like regression test to check if all data, subscription transaction preserved after transfer)?
  4. As recipient account, should I set up my subscription group before accepting a transfer?
  5. When the entity of name would be changed on App Store? Is that the time when the recipient account click "accept the transfer"?

Thanks

Answered by DTS Engineer in 828487022

I'd focus on the iCloud side and let other folks comment on the questions related to subscription and entity name.

As recipient account, do I need to do anything (like enable some iCloud related features) before accepting a transfer in the aspect of iCloud sharing feature?

Before starting the transfer, the recipient account doesn't need to do anything related to iCloud.

On the transferring account side though, if the app relies on some important iCloud data to work, you might consider releasing a new version that enables users to backup the data from iCloud. In the case where the transfer fails, this makes sure that users still have the data.

I notice that UbiquitousKVStore automatically create a $(TeamIdentifierPrefix)$(CFBundleIdentifier) in my entitlements file. Which means after the transfer, the container's name would change because of TeamID's change. Do I need to change that to use the original TeamID to keep the container's name the same?

After accepting the transfer, the provisioning profile the portal generates for the recipient account should contain the valid ID for UbiquitousKVStore, and you need to grab the ID from the profile and replace the one in the .entitlements file with it.

As a developer there are actually two stages when transferring an app, "accept a transfer", "publish a new version after accepting a transfer". I wonder when publishing with new account, except for changing the provisioning team file, what others I need to do to ensure that the transferred app has all authority to access "previous service" (like regression test to check if all data, subscription transaction preserved after transfer)?

If everything goes well, the transferred app should have full access to the iCloud container and key-value store , and you can test your app in the way you do for a normal update.

When the entity of name would be changed on App Store? Is that the time when the recipient account click "accept the transfer"?

I believe that the entity of name will change immediately after the recipient account publishes an update. I haven't really tried and confirmed though.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

I'd focus on the iCloud side and let other folks comment on the questions related to subscription and entity name.

As recipient account, do I need to do anything (like enable some iCloud related features) before accepting a transfer in the aspect of iCloud sharing feature?

Before starting the transfer, the recipient account doesn't need to do anything related to iCloud.

On the transferring account side though, if the app relies on some important iCloud data to work, you might consider releasing a new version that enables users to backup the data from iCloud. In the case where the transfer fails, this makes sure that users still have the data.

I notice that UbiquitousKVStore automatically create a $(TeamIdentifierPrefix)$(CFBundleIdentifier) in my entitlements file. Which means after the transfer, the container's name would change because of TeamID's change. Do I need to change that to use the original TeamID to keep the container's name the same?

After accepting the transfer, the provisioning profile the portal generates for the recipient account should contain the valid ID for UbiquitousKVStore, and you need to grab the ID from the profile and replace the one in the .entitlements file with it.

As a developer there are actually two stages when transferring an app, "accept a transfer", "publish a new version after accepting a transfer". I wonder when publishing with new account, except for changing the provisioning team file, what others I need to do to ensure that the transferred app has all authority to access "previous service" (like regression test to check if all data, subscription transaction preserved after transfer)?

If everything goes well, the transferred app should have full access to the iCloud container and key-value store , and you can test your app in the way you do for a normal update.

When the entity of name would be changed on App Store? Is that the time when the recipient account click "accept the transfer"?

I believe that the entity of name will change immediately after the recipient account publishes an update. I haven't really tried and confirmed though.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

Thanks! So for UbiquitousKVStore, theoretically if I called synchronize() every time I shouldn't worry about CloudKV data right? What about custom container, CloudKit - CoreData, do I need to manually synchronize it? Say context.save() would sync to the cloud immediately rather than iCloudKV's "lazy strategy" right?

synchronize() synchronizes in-memory keys and values with those stored on disk. Similarly, context.save() saves the changes to the Core Data store on the disk. When the data synchronizes with CloudKit server is determined by the system. See TN3162: Understanding CloudKit throttles for the whole picture.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

CloudKit settings when transferring my App to another account
 
 
Q