Although this adds complexity to the client, its ultimately a far better solution than having Apple come up with one of a few server-side mechanisms for conflict resolution. Third, create an iCloud container that hosts your data in iCloud. Rather than relying on individual notifications to give you detailed knowledge of what change an individual notification represents, you use a notification to simply indicate that something has changed, and then you can ask CloudKit whats changed since the last time you asked. Finally, I'll tap Send to send the email. Add the following code as one of the modifiers for your List: This code uses getShare(_:) and retrieves CKShare. At this point, if you shared the invitation via text message, open Messages and tap the invitation. When the app receives a notification, check that it corresponds to the subscription you created, and if so, pass it down to the CloudKitNoteDatabase singleton. The unique record id name doesn't seem to be enough to find the record. how to share data between devices using CloudKit databases and the UIKit framework. I'm going to start by launching my application on Jermaine's device and tapping this plus(+) sign in the upper-right corner to create a new post. For example, a user may have made edits on one device while in airplane mode, and then absent-mindedly made different edits on another device before turning airplane mode off on the first device. that controls who can access these zones that I own. A participant is any other iCloud account. CloudKit sharing involves the creation of CKShare objects initialized with the record to be shared. And I'd like to show you one specific call site in the MainViewController, where I needed to know whether or not an object is shared. Apple has been adding data sharing into many of its first-party apps, including: Files Reminders Notes Calendar Photos Activities Find My Maps Music Health The app designer is always in the best position to define rules for these situations, which can include everything from context-aware automatic merging to user-directed resolution instructions. Hiring? After a short wait, the post I created on Jermaine's device is now visible on this device. For example, this user may have a private zone. Second, enable the iCloud capability in your app. Tap the shared object to go to the detail screen. With NSPersistentCloudKitContainer, applications can operate on shared objects from any Apple device. The brute force approach of requiring an active CloudKit connection when using the app is not at all satisfying from the users perspective, and, in fact, may be grounds for rejection from the Apple App Store. Differentiating private data and shared data in SwiftUI. to call the contains method of the set I created. by tapping this person icon in the upper right. that I've added to bring up the sharing controller. Download iOS 15.0+ iPadOS 15.0+ Xcode 13.4+ watchOS 8.0+ Overview More and more people own multiple devices and use them to share digital assets or to collaborate for work. There are a couple of special situations to be aware of when you save a note. Now I'm going to add a new post, give it a title, and tap Done. based on the relationship they have to other objects. In the projects settings, set the signing team to your paid developer account. It's called the SharingProvider. and how that affects the types of experiences you can build. For example, I can send it to my friends as an iMessage or email. It's free to sign up and bid on jobs. that is allowed to operate on those objects in some way. Before an app can take advantage of CloudKit sharing, the CKSharingSupported key needs to be added to the project Info.plist file with a Boolean value of true. of shared objects without ever talking to the CloudKit server. So that's how we use NSPersistentCloudKitContainer to combine the .private and .shared databases, create shares for objects, and accept sharing invitations. which brings us to the second key concept: and CloudKit structure these shared objects. At what point of what we watch as the MCU movies the branching started? After a short wait, the post I created on Jermaine's device is now visible on this device as well. a class written specifically for testing, which allows me to trivially inject custom logic. A modification performed on a share will, therefore, be reflected in the original private database. Finally, I invoke UICloudSharingController's completion block with the results provided by NSPersistentCloudKitContainer, which tells it I'm ready to continue the sharing flow. So I'll change the share options to mark the share as View Only. How did StorageTek STC 4305 use backing HDDs? and a shared zone that they own in their .private database. For example, if you want to extend this app to handle multiple Notes rather than just one, you could do so more readily (and with higher resulting performance) than if youd just used Apples convenience APIs. Participants can have different roles and permissions that constrain how they can act on a particular set of objects, which brings us to the second key concept: how NSPersistentCloudKitContainer and CloudKit structure these shared objects. CloudKit has its own CKError class, derived from Error, but you need to be aware of the possibility that other errors are coming through as well. First off, you need to make sure youre starting from a valid CKRecord. Go to the first device you created the share from, because you need to be the Owner to access the Share Options. We'll show you how to encourage collaboration between people using your app and support those interactions with Apple frameworks. A general guideline is to use com.company_name.bundle_identifier. [music]. For example, I might need to know whether or not an object is shared. Now, you should see a Button with Label("Delete", systemImage: "trash"). The CloudSharingView has three properties: In makeUIViewController(context:), the following actions occur. Sharing documents with the project you linked to relies on [NSFileManager URLForPublishingUbiquitousItemAtURL:expirationDate:error:]. Download iOS 13.0+ iPadOS 13.0+ Xcode 13.0+ Mac Catalyst 13.0+ Overview As technology advances, people collaborate with others through cloud-based apps more than ever. The techniques outlined in this chapter will be put to practical use in the chapter entitled An iOS CloudKit Sharing Example. Open CoreDataStack.swift. As I mentioned, the SharingProvider includes, and I encourage you to check out their implementations. To understand these challenges a bit more clearly, we need to identify two crucial concepts for sharing. In all, I added a little over 1200 lines of test code, and I hope these examples make it really easy for you to build tests in your own applications. Prior to the release of iOS 10, the only way to share CloudKit records between users was to store those records in a public database. Next, I'll tap Mail and invite Jermaine and Mary. In this article, Ill demonstrate how to use CloudKit to keep a users data in sync between multiple clients. If I tap on it, I can see that the Edit button is disabled and the participants entry for Mary shows that she is a Read-Only participant on the share. to show that the post is part of a share. Implicit in all of this is that CloudKit may not always be available. From here, tap the Share button in the top-right corner. To make it easy to build applications that use this shared data, NSPersistentCloudKitContainer has to also help us make sense of all of these objects so that we can build informative user interfaces for our users. here, the shared store for my application. Now that youve sent an invitation to your second user, you need to set the app to accept the invitation and add the data into the shared store. So I'll change the share options to mark the share as View Only. It is important to be aware that when a share recipient accepts a share they are actually receiving a reference to the original record in the owners private database. Add the following method to your extension: With this code in place, you can determine if the destination is already shared and then take the proper action. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. Were you able to figure it out? Each participant will also have their own collection, applications can operate on shared objects. You do a bit of requisite error checking and then simply fetch the actual data from the CKRecord and store the values in your member fields. For iOS and macOS, Apple provides a robust toolkit, called CloudKit API, which allows developers targeting Apple platforms to solve this synchronization problem. CloudKit provides a full range of error codes, with accompanying information, to allow developers to handle various edge cases and, where necessary, provide detailed explanations to the user about possible issues. Next, add the following code under the // TODO: 2 comment: This code creates NSPersistentContainerCloudKitContainerOptions, using the identifier from your private store description. [/spoiler]. Photos also allows me to view the participants on the album. Is lock-free synchronization always superior to synchronization using locks? CloudKit, the technology behind iCloud, enables iOS apps to synchronize data across a user's devices, as well as share data between users, with solid privacy and security features built-in. acceptShareInvitations(from metadata: into persistentStore: I used this method in the AppDelegeate's application, userDidAcceptCloudKitShare( with metadata:) method, to simply pass the incoming share metadata. If you've worked with sharing before, you're probably familiar with hierarchical sharing, where these records are associated with a root record called the share. Select your desired delivery method and send the invitation. The goal is to fetch the associated CKShare for that object whenever the detail view appears. introduced in the "What's New in CloudKit" session. where my friends and I can share our photos with each other. You see a travel journal screen with an empty state message and a button. Synchronizing a Local Store to the Cloud. Finally, this test asks the MainViewController, in the sharedObjectIDs set have the expected prefix. If I tap on it, I can see that the Edit button is disabled and the participants entry for Jermaine shows that he is a Read-Only participant on the share. Asking for help, clarification, or responding to other answers. So we've updated our sample application and the documentation to demonstrate how you can use it in your own applications, including how you can write tests to verify how your application responds to the different states objects can be in when working with CloudKit. Launch a simulator. You need to extract information about the participants of this share. was to tell NSPersistentCloudKitContainer. This controller invites other users to contribute to the data in the app. When the app comes up, youll notice the shared journal entry doesnt show up. What is the easiest way to share files between users with CloudKit? To view the purposes they believe they have legitimate interest for, or to object to this data processing use the vendor list link below. [/spoiler]. In anticipation of this, split the save function into two steps. Some of our partners may process your data as a part of their legitimate business interest without asking for consent. Build apps that share data through CloudKit and Core Data. The actual CKRecordID is a bit more complicated in that it includes the zoneID. a number of API methods to align with each of these concerns. Am I being scammed after paying almost $10,000 to a tree company not being able to withdraw my profit without paying a fee. The last change I had to make was to be able to accept share invitations, which I do using this new method on NSPersistentCloudKitContainer: acceptShareInvitations(from metadata: into persistentStore: I used this method in the AppDelegeate's application userDidAcceptCloudKitShare( with metadata:) method to simply pass the incoming share metadata directly to NSPersistentCloudKitContainer. Here you created a CKContainer property using your persistent container store description. Note that, in my example application, this conflict resolution step happens in the CloudKitNote class, described later. Over 300 content creators. Next, I configure an instance of the BlockBasedShareProvider, a class written specifically for testing, which allows me to trivially inject custom logic into the sharingProvider the MainViewController uses. this new Allows Cloud Encryption checkbox. So, an offline mode must be carefully considered. More advanced cases can use SQLite, or the equivalent, as a shadow database for offline redundancy purposes. When the user accepts the share, the corresponding app is launched and passed metadata relating to the shared record so that the record can be fetched and displayed. I've already saved Heather and Mary in my address book, so they're easy to find. Thats it! You can read and write records, query for records that match a set of criteria, and (most importantly) receive notification of changes to any of the above. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive Update the selected zone from defaultZone to the automatically generated com.apple.coredata.cloudkit.zone. However, CloudKit gives you the tools you need for this. I'm Nick Gillett, an engineer here at Apple on the Core Data team. This is because you havent accepted the invitation yet. Specify record type as CD_Destination. whether or not to convert the title of a post. Under isShared(object:), add the following methods: These methods return a Boolean based on the objects permissions. Find centralized, trusted content and collaborate around the technologies you use most. And I will be able to access and operate on the objects that they share with me. Returning to the sample application, I can see the data from the first demo is now displayed with some new user interface decorations to indicate that the post is shared. Swift, Android, Kotlin, Flutter, Dart, Server-Side Swift, Unity, and more! Since this is a first example of using an operation, here are a couple of general observations: First, all CloudKit operations have custom completion closures (and many have intermediate closures, depending on the operation). For the sake of discussion, let's imagine I want to share this photo with some friends of mine. As I mentioned, the SharingProvider includes a number of other important methods for the sample application, and I encourage you to check out their implementations and the tests I wrote for how they impact the user interface. Sync user data between multiple apps from the same developer. In the window that comes up, enter your containers name. Tip: Since push notifications arent fully supported in the iOS simulator, you will want to work with physical iOS devices during development and testing of the CloudKit notification feature. When and how was it discovered that Jupiter and Saturn are made out of gas? about the CKShare a specific post resides in. When a user decides to share CloudKit data, a share link in the form of a URL is sent to the person with whom the data is to be shared. Once youve completed that task, set showShareSheet, which presents CloudSharingView, to true. Photos also allows me to view the participants on the album by tapping this person icon in the upper right. than the simple injection I used in the test. This practice allows CloudKit to better manage network transfer and server-side storage of these types of items. If it is, then this object is already shared. And you can see it's a bit more complicated than the simple injection I used in the test. Also, CloudKit provides a specific record type for large binary objects. You could solve this by creating a CKRecord that contains a CKAsset which is the file that you want to share. CloudKit automatically creates a default zone for the private database. To complete the demo, I had to make two other changes. Photos implements a system control here in the lower left that allows me to call up an Action sheet. In the iCloud section, tap the + button underneath Containers to add a custom container. with their role, permissions, and acceptance state. Finally, I'll tap Send to send the email. Our example use case is a simple note application with just a single note, for illustration purposes. share(_ managedObjects: to share: completion:) is a new method designed to pair directly with UICloudSharingController. to write all of these tests and structure the application. In my brief demo, I showed an application that makes use of two CloudKit databases, the .private and the .shared database. Unlike iCloud, CloudKit does have the option to have public data available to anyone who uses the app. The first iteration of Core Data in iCloud on iOS worked on top of document storage and employed the same iCloud APIs. After the share has been saved to the database, the cloud sharing controller needs to be notified that the share is ready to be sent. On Mary's device, I'll open Mail and tap the link inside the email I sent, which opens up my application. For example, the zone that NSPersistentCloudKitContainer manages. In many cases, it can infer where records belong based on the relationship they have to other objects. This is new iOS 15 and allows NSPersistentCloudKitContainer to be configured to mirror persistent stores to the .shared CloudKit database. into the sharingProvider the MainViewController uses. What is the easiest way to share files between users with CloudKit? The most common options are via email or text message. As you prepare to present your CloudSharingView, you need this property because the second parameter of CloudSharingView is a CKContainer. Likewise, you can't choose to unencrypt a field that is already encrypted. Get the most out of CloudKit Sharing Discover how apps can use CloudKit to share records with others. If I'm allowed to, I can add records that I own. Select recordName from the list and ensure the index type is Queryable. This snippet of code is part of a test case I wrote for the MainViewController to ensure that its table cells correctly indicate if a post is shared. I can see my new album with the photo I shared. And exactly how much did I have to change in the sample application? This allows CloudKit to send a silent push notification to your device when data has changed in iCloud and your device needs to update to reflect this change. If I select the location attribute, I can see its configuration in the data model inspector on the right. However, you dont have any metadata about the share. If necessary, you then pass the updated server record to CloudKit to write the new record. depending on whether or not they are the owner of those zones. You can now write, read, and handle remote notifications of updates to your iCloud-stored application data using the CloudKit API. What capacitance values do you recommend for decoupling capacitors in battery-powered circuits? For your Note app, you can use the default container. The actual implementation for isShared is in the CoreDataStack, which manages the persistent CloudKit container for my application. When I'm signed in to iCloud, Photos supports another option for sharing: a shared album. Can users edit their own private data in CloudKit. But this isn't how NSPersistentCloudKitContainer works. It: Now, open DestinationDetailView.swift. and the cells that correspond to unshared objects don't. is meant to be invoked in the create-share phase, that need to be shared and to create a share. Note that the same code will work for macOS clients as well, with slight adjustments for differences in how notifications work on that platform. The UICloudSharingController is a view controller that presents standard screens for adding and removing people from a CloudKit share record. that he is a Read-Only participant on the share. Checks whether the object is shared. And finally, we'll briefly discuss how NSPersistentCloudKitContainer can help you enable some additional protection for sensitive data stored in iCloud. If a match returns, this object is already shared. CloudKit: For managing structured data and sharing data among users. by tapping the Edit button, I can't delete this post. Subscriptions are one of the most valuable CloudKit features. Add the following method to SceneDelegate: This code first gets a reference to the sharedPersistentStore that you created in the beginning of this tutorial. to NSPersistentCloudKitContainer to support sharing. the participants, and their permissions and roles. Apple provides two levels of functionality in the CloudKit SDK: High level convenience functions, such as fetch(), save(), and delete(), and lower level operation constructs with cumbersome names, such as CKModifyRecordsOperation. This should be a huge saving in back-end development and operations cost for app developers. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. When you start the sharing process later, you'll start to see data populated here if another user shares a records with you. in a way that facilitates this type of injection. You already implemented this method once, when you needed to determine if an object isShared. At the top of your screen, select the dropdown menu and click the container you created from Xcode earlier. In cloud-based data sharing applications, its extremely important to be on the lookout for every possible scenario. For each participant, NSPersistentCloudKitContainer manages objects in two CloudKit databases, the .private and the .shared database. Thanks for contributing an answer to Stack Overflow! All the user needs to do at this point is enter the contact details for the intended share recipient and send the message. Book about a good dark lord, think "not Sauron", How to choose voltage value of capacitors, Rename .gz files according to names in separate txt-file. Search for jobs related to Cloudkit share data between users or hire on the world's largest freelancing marketplace with 20m+ jobs. Let's see that in action. we have built in to NSPersistentCloudKitContainer. From here, you store a reference to CKShare that returns from the share method. To understand these challenges a bit more clearly. by the presence of their objectID in this set. Next, we'll take a deep dive into the mechanics of sharing. Add a destination. before deploying your schema to production. Within this container, youre going to use the private database (because you want the users note to be seen only by that user) and within the private database, youre going to use a custom record zone, which enables notification of specific record changes. The version field is simply an illustration of good practice for upgrade proofing, keeping in mind that a user with multiple devices may not update your app on all of them at the same time, so there is some call for defensiveness. CloudKit notifications arrive via the standard iOS notification mechanism. The simple act of writing a record to the database is straightforward enough, but in my example, with multiple clients, this is where youll face the potential issue of handling a conflict when multiple clients attempt to write to the server concurrently. If you would like to change your settings or withdraw consent at any time, the link to do so is in our privacy policy accessible from our home page.. Because of this, when the app launches and you sync with iCloud, the data you have in iCloud synchronizes with your device and automatically displays. Likewise, I can't swipe to delete this post, and if I put the table view in editing mode. Under isShared(object:), add: With this code in place, open CloudSharingController.swift and add the following code to cloudSharingControllerDidStopSharing(_:): Thats it! The SharingProvider has methods for binding directly to specific call sites in my application. The consent submitted will only be used for data processing originating from this website. fetchShares(matching objectIDs:) is new in iOS 15 and allows me to get the CKShare for a specific post. It is capable of handling large file transfers seamlessly. Note also, I am using a CKQuerySubscription with a very simple always true predicate to watch for changes on the one (and only) Note record. Access these zones that I 've added to bring up the sharing controller to check out implementations! For every possible scenario objectIDs: ) is new iOS 15 and me. Check out their implementations you the tools you need to know whether or not an object is already.... Of our partners may process your data in CloudKit CloudKit container for my application an sheet. You should see a button with Label ( `` delete '', systemImage ``... Find the record those zones to access the share engineer here at Apple on the objects that they share me. On iOS worked on top of your screen, select the dropdown menu and the. Starting from a valid CKRecord if I 'm going to add a new post and... Modification performed on a share a custom container of updates to your application... Now, you can see it 's a bit more complicated than the simple I. When the app comes up, enter your containers name unencrypt a that., tap the share which presents CloudSharingView, to true two CloudKit databases the! Business interest without asking for help, clarification, or responding to other objects, allows! Ckshare that returns from the List and ensure the index type is Queryable, or responding to objects. Adding and removing people from a valid CKRecord 'm Nick Gillett, an offline must. With NSPersistentCloudKitContainer, applications can operate on shared objects these types of experiences you see! Implicit in all of this is new in iOS 15 and allows NSPersistentCloudKitContainer to combine the and! Shared object to go to the first device you created the share from, because you to. Better manage network transfer and Server-Side storage of these concerns of mine handle remote notifications of updates to paid! Error: ] back-end development and operations cost for app developers own collection, applications can operate on the permissions! From a valid CKRecord based on the objects that they own in their.private.... Id name does n't seem to be configured to mirror persistent stores to the data in on. Those interactions with Apple frameworks of experiences you can build I used in the sharedObjectIDs set have the option have! 'M Nick Gillett, an engineer here at Apple on the objects that they share with.! To send the email fetchshares ( matching objectIDs: ), the.private and the.shared.... About the share options to mark the share options tap send to send the invitation way that facilitates this of... Updates to your paid developer account to iCloud, CloudKit provides a specific record for. More complicated than the simple injection I used in the test UICloudSharingController is a view controller that standard! Trash '' ).private database note app, you ca n't swipe to delete this post, and remote... To write the new record the signing team to your iCloud-stored application using!.Shared databases, create shares for cloudkit share data between users, and tap the share capacitance do! Discover how apps can cloudkit share data between users CloudKit to share: completion: ), add following... And accept sharing invitations the Core cloudkit share data between users team to align with each of types. Use CloudKit to share records with others network transfer and Server-Side storage of these concerns want to share data multiple! At what point of what we watch as the MCU movies the branching started not able... Participant will also have their own collection, applications can operate on those objects two. `` trash '' ) a CKAsset which is the easiest way to share expected prefix.private database the., permissions, and acceptance state tap Mail and tap the invitation the CloudKit..., trusted content and collaborate around the technologies you use most the top-right corner the Core data in.. Email I sent, which manages the persistent CloudKit container for my application to anyone uses. Be enough to find the record with just a single note, for illustration purposes NSFileManager URLForPublishingUbiquitousItemAtURL::. 'M Nick Gillett, an offline mode must be carefully considered permissions, and if I select the attribute. Email I sent, which presents CloudSharingView, you then pass the server. Select your desired delivery method and send the invitation yet methods return a Boolean based on objects! Most common options are via email or text message, open Messages and tap +! Or email for offline redundancy purposes as a shadow database for offline redundancy purposes paying almost $ 10,000 a... It to my friends as an iMessage or email the title of a.! Device you created from Xcode earlier it to my friends and I will put. Write the new record site design / logo 2023 Stack Exchange Inc ; user contributions licensed under CC BY-SA from... Chapter entitled an iOS CloudKit sharing involves the creation of CKShare objects initialized with the project linked. Dive into the mechanics of sharing invoked in the sharedObjectIDs set have the option have... With me following code as one of the modifiers for your List: this code uses (... Your desired delivery method and send the email relationship they have to change in the sharedObjectIDs set the... Saturn are made out of CloudKit sharing example their legitimate business interest without for... Of special situations to be on the relationship they have to other answers are the to! To add a new method designed to pair directly with UICloudSharingController of API to... Ckshare for a specific record type for large binary objects Server-Side storage of these concerns dive! And handle remote notifications of updates to your iCloud-stored application data using the CloudKit API practical in. Ckcontainer property using your persistent container store description you then pass the updated record...: a shared zone that they share with me collection, applications operate... Discussion, let 's imagine I want to share ) is a Read-Only participant the. Binding directly to specific call sites in my application conflict resolution step in... Extract information about the participants of this is that CloudKit may not always be available 're to! Without ever talking to the CloudKit server the CloudKit API public data available to who. We & # x27 ; s free to sign up and bid on jobs, Unity, tap... View the participants on the lookout for every possible scenario may have a private zone title of post... My application to get the most valuable CloudKit features default zone for intended... This user may have a private zone belong based on the right following actions occur if object... Concept: and CloudKit structure these shared objects on Jermaine 's device is now visible on this device to shared... That affects the types of experiences you can now write, read, and will. Is allowed to, I can share our photos with each other operations cost app. Use SQLite, or the equivalent, as a shadow database for offline redundancy purposes share ( _ ). File that you want to share records with others it & # x27 ; ll show you how to CloudKit... At Apple on the lookout for every possible scenario how to encourage collaboration between people using your container... As well link inside the email options are via email or text message, open Messages and tap the button... Configuration in the create-share phase, that need to extract information about the share button in the comes... New iOS 15 and allows me to view the participants of this is because you havent accepted the invitation text! Are one of the modifiers for your List: this code uses getShare ( _: ) the. Of those zones configuration in the test you shared cloudkit share data between users invitation via text message, open Messages tap! Trash '' ) tap send to send the invitation via text message share data between devices CloudKit! Use NSPersistentCloudKitContainer to be invoked in the iCloud section, tap the invitation records belong based on the by. Methods for binding directly to specific call sites in my example application, this conflict resolution step in! And Saturn are made out of gas is lock-free synchronization always superior to synchronization using locks methods: methods... Of your screen, select the dropdown menu and click the container created. Ll show you how to use CloudKit to better manage network transfer and Server-Side storage of these tests structure. With the project you linked to relies on [ NSFileManager URLForPublishingUbiquitousItemAtURL: expirationDate::! An offline mode must be carefully considered set have the option to have public data available to who! Contributions licensed under CC BY-SA create shares for objects, and handle remote notifications of updates to your paid account... Name does n't seem to be invoked in the top-right corner how did... Contains method of the modifiers for your note app, you dont have any about... Identify two crucial concepts for sharing: a shared album to my friends as an iMessage or email you. You havent accepted the invitation via text message, open Messages and tap the share as view Only, they... The message fetchshares ( matching objectIDs: ) is new in iOS and! Infer where records belong based on the share button in the original private database I can see my new with. Private database you save a note new post, give it a title, and remote. Created a CKContainer anticipation of this is because you havent accepted the.! This device as well the chapter entitled an iOS CloudKit sharing involves the creation of CKShare objects initialized with record. Share recipient and send the email key concept: and CloudKit structure these shared objects container my. Correspond to unshared objects do n't first iteration of Core data in.. Situations to be invoked in the CoreDataStack, which presents CloudSharingView, to true objects!