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?
Asked
Active
Viewed 1,686 times
7

Ilesh P
- 3,940
- 1
- 24
- 49
-
have your issue resolved ? – vhgson Oct 23 '20 at 03:50
3 Answers
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
-
1Thanks 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
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 > 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