core-datacloudkitcloudkit-js

CloudKit JS deserialize [Double] Transformable type data


I followed How to save Array to CoreData? to create a Transformable field in my data model, and have saved records of that type to CloudKit. I would now like to access this data from a web app. How can I deserialize it?

The data looks like this in the JS object response:

YnBsaXN0MDDUAQIDBAWKi4xYJG9iamVjdHNYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3CvED8GB0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4RVJG51bGzSCAkKC1YkY2xhc3NaTlMub2JqZWN0c4A+rxA8DA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHgAKAA4AEgAWABoAHgAiACYAKgAuADIANgA6AD4AQgBGAEoATgBSAFYAWgBeAGIAZgBqAG4AcgB2AHoAfgCCAIYAigCOAJIAlgCaAJ4AogCmAKoArgCyALYAugC+AMIAxgDKAM4A0gDWANoA3gDiAOYA6gDuAPIA9Iz+ChKQAAAAAIz+rvBuAAAAAIz+ShMwAAAAAI7+NhhwAAAAAI7+YXh8AAAAAI7+YF8YAAAAAI79qBWAAAAAAIz+Uds6AAAAAIz+dRGaAAAAAI79v+awAAAAAIz+EOhMAAAAAI79muLgAAAAAI7+2fcpgAAAAIz+hwSYAAAAAIz+W1zMAAAAAIz+bdJ8AAAAAI7+ZfB8AAAAAI7+kFm6AAAAAIz+mHaYAAAAAIz9C6PAAAAAAI7+Qp4pAAAAAIz+3tR4AAAAAIz+Tl/eAAAAAI7+kd7agAAAAIz+xC5YAAAAAI7+OmbOAAAAAIz+01GcAAAAAIz+enIRAAAAAIz+XrCYAAAAAI79dnTwAAAAAI7+tWjPgAAAAIz+fRwTAAAAAIz93ZtIAAAAAIz+jFAwAAAAAI7+kYxTAAAAAI7+rht5AAAAAIz+EU0XAAAAAI7+hufMAAAAAI7+JPgAAAAAAIz+SL45AAAAAI7+lrQiAAAAAI7+howoAAAAAI7+Ld1AAAAAAI79jN2QAAAAAI7+fFdtAAAAAI7+I7FiAAAAAIz+FCQuAAAAAIz89MOAAAAAAI79NwfgAAAAAI7+I1msAAAAAIz+K2VEAAAAAIz9wqKkAAAAAI7+I4AAAAAAAIz9PhlgAAAAAI78stgAAAAAAI7+KxJYAAAAAIz9CRuAAAAAAIz+BPHIAAAAAIz9+P6EAAAAAIz9nB14AAAAA0oWGh4hYJGNsYXNzZXNaJGNsYXNzbmFtZaKIiVdOU0FycmF5WE5TT2JqZWN0EgABhqBfEA9OU0tleWVkQXJjaGl2ZXLRjY5Ucm9vdIABAAgAEQAaACMALQAyAHQAegB/AIYAkQCTANIA1ADWANgA2gDcAN4A4ADiAOQA5gDoAOoA7ADuAPAA8gD0APYA+AD6APwA/gEAAQIBBAEGAQgBCgEMAQ4BEAESARQBFgEYARoBHAEeASABIgEkASYBKAEqASwBLgEwATIBNAE2ATgBOgE8AT4BQAFCAUQBRgFIAUoBUwFcAWUBbgF3AYABiQGSAZsBpAGtAbYBvwHIAdEB2gHjAewB9QH+AgcCEAIZAiICKwI0Aj0CRgJPAlgCYQJqAnMCfAKFAo4ClwKgAqkCsgK7AsQCzQLWAt8C6ALxAvoDAwMMAxUDHgMnAzADOQNCA0sDVANdA2YDawN0A38DggOKA5MDmAOqA60DsgAAAAAAAAIBAAAAAAAAAI8AAAAAAAAAAAAAAAAAAAO0

I pretty much have the same question as https://developer.apple.com/forums/thread/70286, but there is no answer there either.


Solution

  • Transformables are encoded to binary property lists using NSKeyedArchiver. For CloudKit they're then base64 encoded. To decode this, you'll need to

    1. Base64 decode it, to get a binary plist.
    2. Decode the binary plist into something recognizable.

    To give you an idea of what you have there, you could save that string to a file on a Mac and take a look. If you save it to a file called array.txt, you can decode it with

    base64 -d < array.txt > array.plist
    

    You can't read array.plist just by looking at it because it uses a binary encoding. But you can convert it to XML to see what's there with

    plutil -convert xml1 array.plist
    

    The result can be found here: https://gist.github.com/atomicbird/d5ca330c02cff95bbee7ee5d594f47f4

    Looking around, there are some open source parsers for binary plists and for converting NSKeyedArchiver encoded data to something more useable. I haven't tried any, but that may get you going.