The SwiftUI ShareLink
component produces Xcode console errors and inconsistent filenames when using
custom file types that conform to Transferable. I have tried a variety of settings and Transferable
type conformance, but none of them lead to the desired results.
MacOS 15.2 Xcode 16.2 iPhone 16 Pro with iOS 18.2
Users should be able to seamlessly share custom file types regardless of the sharing destination. When shared the files should have consitentn filenames and use the registered file extension.
I want to register a custom file type for users to share data and later import it into my app. The files are simple opaque JSON, which are not intended to opened/previewed in other applications.
- I'd like to use SwiftUI's ShareLink to share these in-memory objects on-demand.
- I'd like sharing to work with all applications provided to users in the iOS share sheet. (e.g. Messages, Mail, Telegram, Signal, WhatsApp, etc)
- Filnames should match the
name
propery of the object, and use the registered extension. - When receiving a shared file, tapping it should open in the app.
Many of the options tried produce this in Xcode's debug console:
Failed to load item provider <NSItemProvider: 0x302a7d570> {types = (
"com.hekuli.samplefiletype"
)}, falling back to original item provider
In addition to the code below, the following settings have been added to the Info.plist via: the project's Target -> Info tab.
Instructions were followed as outlined here: https://developer.apple.com/documentation/uniformtypeidentifiers/defining-file-and-data-types-for-your-app
Name: Some Custom Thing Sample File Types: com.hekuli.samplefiletype Handler Rank: Owner
Description: Some Custom Thing Sample File Identifier: com.hekuli.samplefiletype Conforms To: public.data Extension: samplefiletype Mime Types: application/octet-stream
I also tried using various combinations of mime types and public.json
.
The sample code below generates the following file names for the selected share targets, regardless of which Transferable protocol is used.
Save to Files -> "Widget.samplefiletype" CORRECT
Messages -> "Widget.samplefiletype" CORRECT
Mail -> "Widget.samplefiletype" CORRECT
Signal -> "Widget.samplefiletype" CORRECT
WhatsApp -> Doesn't share at all INCORRECT
Telegram -> "file" INCORRECT
AirDrop -> "Some Custom Thing Sample File-4655-924D-1C-0.samplefiletype" INCORRECT