CloudKit share Data between different iCloud accounts but not with everyone
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 !
- Why is iCloud account/CKContainer not being found
- SWIFT: I don't get notifications from my CloudKit app?
- Is there any option to export all cloud kit data?
- CKNotificationInfo soundName does not work
- Not receiving CloudKit push notifications for Custom Record Zone on the Mac
- Seed and maintain CloudKit public database without requiring iCloud login?
2 Solutions Collect From Internet About “CloudKit share Data between different iCloud accounts but not with everyone”
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.
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/
- writeToFile:atomically: what does atomically mean?
- “Semantic error: Redefinition of '__ccContentScaleFactor' with a different type” in Cocos2D v2
- Dealing with different iOS device resolutions in SpriteKit
- Issue with UILabel center text alignment at different font sizes in Xcode Swift
- Implementing OAuth 1.0 in an iOS app
- simple alert view for connection check in a web view
- Is it possible to access OpenGL ES from RoboVM without using LibGDX?
- Can NSManagedObject conform to NSCoding
- What is AWDL (Apple Wireless Direct Link) and how does it work?
- Xcode Organizer: can not use iPhone (dyld_shared_cache_extract_dylibs failed)
- Couldn't play system sound after switching to iOS 5
- Negate #available statement
- What does the /private prefix on an iOS file path indicate?
- Pre-load core data database in iOS 5 with UIManagedDocument
- effective UI styling for iOS app