Как использовать NSSharingService в Catalyst? - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь использовать NSSharingService, чтобы добавить свое катализаторное приложение для обмена таблицей действий в macOS, но получаю сообщение об ошибке NSSharingService is unavailable in Mac Catalyst.

#if targetEnvironment(macCatalyst)
extension NSSharingService { //Error: 'NSSharingService' is unavailable in Mac Catalyst
    class func shareContent ( content: [AnyObject], button: NSButton ) {
        let sharingServicePicker = NSSharingServicePicker (items: content )

        sharingServicePicker.showRelativeToRect(button.bounds, ofView: button, preferredEdge: NSRectEdge.MaxY)
    }
}
#endif

Я нахожу статью об использовании AppKit в Catalyst здесь

Мои шаги:

  1. Создать пакет macOS ReaderTranslatorAppKit и установить PrincipalClass = "ReaderTranslatorAppKit.ReaderTranslatorAppKit" в Info.plist
open class ReaderTranslatorAppKit: NSObject, ReaderTranslatorCommonInterfaces {
    public func test() -> String {
        "test 1"
    }
}

Добавлен ReaderTranslatorAppKit пакет в Embed как платформа macOS Added it to plugin

Создать ReaderTranslatorCommonInterfaces общий протокол

public protocol ReaderTranslatorCommonInterfaces {
    func test() -> String
}
Загрузить ReaderTranslatorAppKit в SceneDelegate.swift
...
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let bundlePath = Bundle.main.builtInPlugInsURL?.appendingPathComponent("ReaderTranslatorAppKit.bundle"),
        let bundle = Bundle(url: bundlePath) {

        bundle.load()

        if let cls = bundle.principalClass as? NSObject.Type,
            let plugin = cls.init() as? ReaderTranslatorCommonInterfaces { //Error: plugin is nil
            print(plugin.test())
        }
        print(bundle)
    }
}

Результат Я получаю ноль при касте cls.init() as? ReaderTranslatorCommonInterfaces. Что не так?

Обновление

Я решил свою проблему, создав проект MacOS вместо Catalyst, разделив код между двумя проектами и используя CFNotificationCenterGetDarwinNotifyCenter и UserDefaults(suitename:) для отправки объектов из моего расширения вприложение здесь

...