I’m trying to share CKRecord
s from my app’s CloudKit database using a CKShare
from an NSSharingServicePicker
, but the picker doesn’t show any sharing services. I’m pretty much doing exactly what the code samples in the WWDC22 video Enhance collaboration experiences with Messages show:
let itemProvider = NSItemProvider()
if let existingShare {
itemProvider.registerCKShare(existingShare, container: container)
} else {
itemProvider.registerCKShare(container: container, preparationHandler: {
return try await createAndSaveNewCKShare()
})
}
Then, I add some metadata as described in the video:
let activityItem = NSPreviewRepresentingActivityItem(
item: itemProvider,
title: "The title",
imageProvider: nil, // TODO: Quick Look preview image
iconProvider: .init(object: NSApp.applicationIconImage)
)
Finally, I create the picker and show it:
let picker = NSSharingServicePicker(items: [activityItem])
picker.show(relativeTo: .zero, of: view, preferredEdge: .minY))
What I then get is a sharing service picker that only shows my recent contacts, but not a single sharing service below that. The metadata is there, i.e. the title and app icon show up:
What am I doing wrong here?
I’m pretty confident that most of the code is correct because it works fine on iOS. There, I use the same itemProvider
as above, but present the share UI like this, which is pretty much the same:
let configuration = UIActivityItemsConfiguration(itemProviders: [itemProvider])
configuration.perItemMetadataProvider = { _, key in
switch key {
case .linkPresentationMetadata:
let metadata = LPLinkMetadata()
metadata.title = title
metadata.imageProvider = nil // TODO: Quick Look preview image
metadata.iconProvider = nil // TODO: App icon?
default:
return nil
}
}
let viewController = UIActivityViewController(activityItemsConfiguration: configuration)