Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
448 views
in Technique[技术] by (71.8m points)

ios app extension - iOS AppExtension : How can I Combine NSExtensionActivationRule and NSPredicate

I am currently developing an iOS application containing a Share extension.

I realized that the NSExtensionActivationSupportsImageWithMaxCount key doesn't allow me to activate my Share extension on .jpeg or .png URLs ("public.image" UTI, kUTTypeImage) under Safari (ie : an imgur link).

I can still activate and test my extension if I switch to a NSActivationRule = TRUEPREDICATE, but it is forbidden for a released app.

I filled a bug on radar in case of it wasn't wanted (even facebook, twitter, etc... aren't activated on this URLs)

Right now, I would like to combine the following keys and the "public.image" in a NSPredicate string as the documentation says (https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8)

So I have to translate the keys to a UTI

So far I have translated:
- NSExtensionActivationSupportsFileWithMaxCount to "public.file-url" kUTTTypeFileURL
- NSExtensionActivationSupportsMovieWithMaxCount to "public.movie" kUTTypeMovie
- NSExtensionActivationSupportsText to "public.text" kUTTypeText
- NSExtensionActivationSupportsWebURLWithMaxCount to "public.url" kUTTypeURL

But I don't find the type translation for:

  • NSExtensionActivationSupportsWebPageWithMaxCount, "public.HTML" is it kUTTypeHTML ?

Does somebody already used this keys inside a predicate?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

What I ended up doing is 1) allowing TRUEPREDICATE temporarily, and using some logic like this`

    NSExtensionItem *item = extensionContext.inputItems.firstObject;

    if ( item )
    {
        NSItemProvider *itemProvider = item.attachments.firstObject;

        if ( itemProvider )
        {
            NSArray *registeredTypeIdentifiers = itemProvider.registeredTypeIdentifiers;
            NSLog( @"registeredTypeIdentifiers: %@", registeredTypeIdentifiers );
        }
     }`

This will give you all the types of the document you want to share (example: "public.url"). Because of the multiple types, my predicate became a little complex:

SUBQUERY (
                extensionItems,
                $extensionItem,
                SUBQUERY (
                $extensionItem.attachments,
                $attachment,

                (
                           ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.tiff"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.bmp"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.word.doc"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.openxmlformats.wordprocessingml.document"
                        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.comma-separated-values-text"
                )
                AND
                (
                     NOT ( ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.photoshop-image" )
                )

    ).@count == $extensionItem.attachments.@count
).@count == 1

This basically looks for any file type for image (other than adobe psd), pdf, txt, csv or doc/docx. It also only allows 1 document to be shared at a time.

It looks like kUTTypeImage includes PSD - hence my blocking of that format ( "com.adobe.photoshop-image" ).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...