A number of syncing improvements are being introduced in v2.9.13. Performance and reliability are the focus. Both the iOS and Mac apps are receiving the same treatment.

Part of the changes include a slight change in the location Downcast stores it's iCloud data. This will prevent older versions of Downcast from syncing with v2.9.13+. It's important that you upgrade all of your devices if you want them to continue syncing with each other. I didn't want to do this, but a specific iCloud related behavior required this in order to fix one of the biggest syncing issues Downcast currently has. The most notable changes are detailed below...

Switch to data scope

iCloud Documents & Data has two scopes: documents scope and data. That's fancy terminology for two different directories in an app's iCloud container that have slightly different behaviors. IOW, documents scope covers any file stored in <iCloud Container Folder>/Documents, data scope covers any other location in your iCloud container besides the Documents folder.

There are two primary differences between these two scopes...

Difference 1 - Duplicate file handling

When an app isn't yet aware of a file that exists in iCloud, there is no 100% reliable way to determine this, it is possible to generate a local file by the same name. When this happens in the documents scope, a new file is created with a numeric suffix. In the data scope, a conflicting version of the same file is created instead. The latter allows you to treat duplicates as conflicts rather than separate files.

Until now, Downcast was storing it's iCloud data in the documents scope. This sometimes lead to different instances of Downcast potentially updating different copies of Downcast's iCloud data until both instances were killed and restarted. This led to syncing issues. There are ways to deal with this but it is far more miserable than simply dealing with conflicting versions per usual. In v2.9.13, Downcast uses the data scope to store its iCloud data. This immediately translates into far more reliable behavior.

Difference 2 - iCloud's Manage Storage UI

In the Manage Storage UI in iOS, the files stored in the documents scope are revealed. This UI allows you to delete individual files manually. Nothing about the data scope is revealed in this UI. Deleting something from the data scope means deleting everything in the data scope. This is fine for Downcast. Our original iCloud reset instructions called for manually deleting each file in the manage storage UI, but now you'll need to choose Delete All Documents & Data instead. However, you really shouldn't need to do this at all going forward. The end of the numerically suffixed files mentioned above should remove the need to delete this data. I'll probably make this an option from within the app itself in the future.

Throttling

I don't know how long this has been going on, but it has recently become clear that iCloud uses pretty aggressive throttling when uploading changed documents. It seems that updating a document just a few times within a few minutes is enough to trigger this. Depending on the frequency of updates, iCloud may postpone uploading a document for several minutes. This increases the risk of a conflict. To reduce the frequency of this, Downcast now conservatively throttles its own updates to this data. It will improve the problem but not solve it.

If you feel like nothing is syncing from one device to another, iCloud may be throttling you. Check the iCloud Syncing options view in Downcast to see if any options are stuck on Uploading (x%). If they are, you're being throttled. It's best to just be patient and avoid actively using Downcast on another device until the throttling period is over.

Other changes

The current status of each sync option is now exposed on Downcast's iCloud Syncing options view.

The iOS & Mac apps now share the same syncing code. This makes a lot of things easier, including the transition to CloudKit.

Improved conflict resolution.

Downcast's sync data is now compressed on disk.

When iCloud isn't available or if iCloud has failed to make Downcast's container available, the sync options view will indicate as much and suggest how to resolve the issue. This replaces the error alert you'd previously get when trying to initialize one of Downcast's syncing options in this scenario.

What about CloudKit?

Still working on it and it will still happen. As usual, it is taking longer than expected, but it has to be done correctly. The changes detailed above only make this easier. More on this later...