UIActivityViewController Скрыть расширение общего доступа к моему приложению
В своем приложении я добавил расширение для общего ресурса, оно работает нормально, но я сталкиваюсь с одной проблемой, когда я приглашаю приложение через UIActivityViewController
Я показываю свое приложение Extension. Как я могу скрыть свое приложение Расширение моего собственного приложения?
3 ответа
Вы можете сделать это, добавив свой тип активности Extension в список исключенных типов активности:
let activityViewController = UIActivityViewController(activityItems: <your items>, applicationActivities: <your supported application activities>)
let extensionActivityType = UIActivityType(<your extension activity type id>)
activityViewController.excludedActivityTypes = [extensionActivityType]
Извините за опоздание, но надеюсь, что этот ответ вам поможет.
Прежде всего, определите следующие строки в своем коде
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 ""
}
}
Здесь com.your.unique.uti - это идентификатор вашей группы приложений, а затем при представлении activityViewController используйте код ниже
let activityViewController = UIActivityViewController(activityItems: [/* Other Items To Share, */ ActionExtensionBlockerItem()], applicationActivities: nil)
Я столкнулся с этой проблемой согласно https://pspdfkit.com/blog/2016/hiding-action-share-extensions-in-your-own-apps/ .
1. Определите метод 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. Выполните прокрутку метода при запуске приложения.
UIActivityViewController.doSwizzling()
3. Добавьте правило активации в ключ «NSExtension» info.plist приложения расширения.
<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>