CloudKit share Data between different iCloud accou

2019-03-09 14:40发布

问题:

In my app I want to share data via iCloud with other iCloud users but not with the whole world but with selected other iCloud users.

I thought about a way this could work, but I am not sure if it will work and if I forgot or misunderstood some things.

Let s say User A wants to be able to share a string with other iCloud users but not with everyone. So User A wants to share „Hello World“ to User B but not to user C and not to User D.

So my app has a Public Data Base and a Record Type that is the same for everyone. In that Record Type there is a Field of type String that is also the same for everyone.

Now User A saves the record „Hello World“ to iCloud. And here comes the trick: I would add a unique identifier like UUID to the string so that something like „Hello World1230ABD6-3C61-1234-802E-D866F09AC012“ will be uploaded to iCloud.

Now User A needs to tell the User he wants to share the data with his UUID, so User A tells it to User B. Now the UUID of User A will be added as a Predicate to the CKSubscription of User B.

This will allow User B to fetch the string from User A, but User C or User D won t receive a CKNotification because they don t have the UUID of User A in their CKSubscription.

Is this going to work? Or is there another design pattern that allows sharing/syncing via iCloud with other iCloud accounts but not with everyone (public) ?

P.S. The data I want to share is not sensitive, so it does not need to be really secure. The data just isn t interesting for everyone (public) so it needs to be shared only to selected other iCloud accounts...

I am thankful for any thoughts or tips how to achieve this !

Thanks

回答1:

There are a couple of ways to achieve something like this. In all cases it comes down to:

  • Add a CKReference field that will be populated with the ID of the user that you want to share with.
  • Make sure your predicate will filter for that CKReference field where the ID is yours (shared with you)

Where and how you store that CKReference depends on how you want to share.

  • If you only want to share with only one person, then just include that CKReference field into your main recordType. Do not add it to the message as you stated in your question. Add an extra field.
  • If you want to share to a limited number of people, then you could add a field to your recordType which is a list of CKReference.
  • If you want to share with a large group of people, then you could add a group recordType which would have a groupID plus a groupMembers recordType where you would store all user CKReference id's who are member of that group.

In all cases the solution would be secure. It all comes down to the predicates that you define in your app. If one of your predicate filters is incorrect, then it could happen that someone sees something that is not for him.

In the demo app of EVCloudKitDao is a chat application based on CloudKit. It is using the convenience library EVCloudKitDao but the structure of sharing something would be similar.



回答2:

CloudKit Sharing was introduced at WWDC 2016. This allows sharing of private database records between a known set of users, which is what it sounds like you're looking for. ...... There is a great overview in the "What's new in CloudKit" session: https://developer.apple.com/videos/play/wwdc2016/226/