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 &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>
Другие вопросы по тегам