7

In my application, I have added my share extension it's working fine, But I face One problem When I invite app through UIActivityViewController I show my application Extension. How can I hide my application Extension of my own application?

Ilesh P
  • 3,940
  • 1
  • 24
  • 49

3 Answers3

0

You can do it by adding your Extension activity type in the list of excluded activity types:

let activityViewController = UIActivityViewController(activityItems: <your items>, applicationActivities: <your supported application activities>)

let extensionActivityType = UIActivityType(<your extension activity type id>)
activityViewController.excludedActivityTypes = [extensionActivityType]
user28434'mstep
  • 6,290
  • 2
  • 20
  • 35
  • 1
    Thanks for your answer, I tried the following code but did not work. `activityVC.excludedActivityTypes = [UIActivityType.airDrop,UIActivityType.print, UIActivityType.postToWeibo, UIActivityType.copyToPasteboard, UIActivityType.addToReadingList, UIActivityType.postToVimeo, UIActivityType(rawValue: "com.tops.pushnotification.MiFTyApp"),UIActivityType(rawValue: "com.tops.pushnotification.PeeponsShareExt")]` – Ilesh P Jan 17 '18 at 04:34
0

First of all, define the below lines in your code

class ActionExtensionBlockerItem: NSObject, UIActivityItemSource {
    func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivityType?) -> String {
        return "com.your.unique.uti";
    }
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
        // Returning an NSObject here is safest, because otherwise it is possible for the activity item to actually be shared!
        return NSObject()
    }
    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
        return ""
    }
    func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivityType?, suggestedSize size: CGSize) -> UIImage? {
        return nil
    }
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return ""
    }
}

Here com.your.unique.uti is your Application group identifier

see this image for reference

and then while presenting activityViewController use the code below

let activityViewController = UIActivityViewController(activityItems: [/* Other Items To Share, */ ActionExtensionBlockerItem()], applicationActivities: nil)
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
singh.jitendra
  • 490
  • 1
  • 9
  • 19
-1

I have come across this issue according to https://pspdfkit.com/blog/2016/hiding-action-share-extensions-in-your-own-apps/

1, Define method swizzling:

// MARK: - Hide Share Extension app from host app
/**
https://pspdfkit.com/blog/2016/hiding-action-share-extensions-in-your-own-apps/
*/
final class ActionExtensionBlockerItem: NSObject, UIActivityItemSource {
    public func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivity.ActivityType?) -> String {
        return AppGroupName
    }

    public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        // Returning an NSObject here is safest, because otherwise it is possible for the activity item to actually be shared!
        return NSObject()
    }

    public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
        return ""
    }

    public func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {
        return nil
    }

    public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return ""
    }
}


extension UIActivityViewController {
    public static func doSwizzling() {
        MethodSwizzleGivenClassName(cls: self, originalSelector: #selector(UIActivityViewController.init(activityItems:applicationActivities:)), overrideSelector: #selector(UIActivityViewController.init(aw_activityItems:applicationActivities:)))
    }

    @objc
    private convenience init(aw_activityItems: [Any], applicationActivities: [UIActivity]?) {
        if aw_activityItems.last is ActionExtensionBlockerItem {
            self.init(aw_activityItems: aw_activityItems, applicationActivities: applicationActivities)
        } else {
            let activityItems = aw_activityItems + [ActionExtensionBlockerItem()]
        
            self.init(aw_activityItems: activityItems, applicationActivities: applicationActivities)
        }
    }
}

2, Do method swizzling at app launch

UIActivityViewController.doSwizzling()

3, Add activate rule to dict of "NSExtension" key of info.plist of extension app

<key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <string>
                    SUBQUERY (
                            extensionItems,
                            $extensionItem,
                            SUBQUERY (
                                    $extensionItem.attachments,
                                    $attachment,
                (ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image"
                || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.audiovisual-content"
                || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.archive"
                || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.disk-image"
                || (SUBQUERY (
                                        $attachment.registeredTypeIdentifiers,
                                        $uti,
                    NOT $uti UTI-CONFORMS-TO "public.folder" AND NOT $uti UTI-CONFORMS-TO "public.url" AND NOT $uti UTI-CONFORMS-TO "dyn.age8u" AND NOT $uti UTI-CONFORMS-TO "dyn.age81y3psq6"
                   ).@count &gt; 0
                   AND ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.file-url")
                 ) AND NOT (ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "group.network.axel.bc")
                            ).@count == $extensionItem.attachments.@count                        
                    ).@count == 1                
                </string>
    </dict>
Simon
  • 237
  • 1
  • 7