Facing the same issue. You can get around the queryable index requirement as follows:
Change the predicate from NSPredicate(value: true) to a predicate w/ condition. If you really want to get all the records, you could make a dummy field which is always the same value and check that.
before (DOES NOT WORK):
let query = CKQuery(recordType: "Snapshot", predicate: NSPredicate(value: true))
database.perform(query, inZoneWith: zoneID) { records, err in
...
Instead:
let query = CKQuery(recordType: "Snapshot", predicate: NSPredicate(format: "version = %d", argumentArray: [version]))
now it doesn't complain. Will test this with CKQueryOperation as well.
Especially useful if you're writing a library and using JIT schema - no need to open up the web UI at all.