swiftshareslcomposeviewcontroller

How to share a Note including Markup with Share Extensions Swift


I've already figured out how to share the general content of a Note (text and pictures). But the way I currently approach the problem the markup of the note is not kept (Titles, Lists, etc.). I just receive the pure text of the note. When you share a note with Mail for instance, you can see that the markup is transferred. Is there a way to do that for your own apps?

My current solution where I only receive the pure text:

class ShareViewController: UIViewController{

    override func viewDidLoad() {

        if let content = extensionContext!.inputItems[0] as? NSExtensionItem {

            // Verify the provider is valid
            if let contents = content.attachments as? [NSItemProvider] {

                // look for images
                for attachment in contents {
                    print(attachment.registeredTypeIdentifiers)


                    if attachment.hasItemConformingToTypeIdentifier("public.plain-text"){
                        attachment.loadItem(forTypeIdentifier: "public.plain-text", options: nil) { data, error in

                            let string = data as! String
                            print(string)
                        }
                    }
                }
            }
        }
    }
}

EDIT:

My current NSExtensionActivationRules:

    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationDictionaryVersion</key>
            <integer>2</integer>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>100</integer>
            <key>NSExtensionActivationSupportsText</key>
            <true/>
        </dict>
    </dict>

Solution

  • Use the attributedContentText property of your NSExtensionItem (content):

    override func viewDidLoad() {
        if let content = extensionContext!.inputItems[0] as? NSExtensionItem {
            // move your content validation to `func isContentValid() -> Bool`
    
            let attributedString = content.attributedContentText // yay NSAttributedString!
        }
    }