#ios #swift #flutter
Вопрос:
У меня есть приложение Flutter с встроенным плагином iOS, реализованным в Swift. Моя цель-позвонить eventSink
изнутри AppDelegate
в рамках UserIntent
обработки. Я пытался следовать, но безуспешно:
Попытка 1
Во время FlutterPlugin.register
обратного вызова я также регистрирую экземпляр плагина в качестве делегата приложения. Код ниже:
public static func register(with registrar: FlutterPluginRegistrar) {
let methodChannel = FlutterMethodChannel(....)
let eventChannel = FlutterEventChannel(....)
let instance = SwiftMyPlugin()
eventChannel.setStreamHandler(instance)
registrar.addApplicationDelegate(instance) // <--- Register as application delegate here
registrar.addMethodCallDelegate(instance, channel: methodChannel)
}
К сожалению, это не влияет на UserIntent
обработку обратных вызовов. Например, рассмотрим следующую реализацию как часть UIApplicationDelegate
SwiftMyPlugin
класса by.
public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// eventSink!("..."); <--- Trying to achieve this
}
Попытка 2
Конечно, когда я перемещаюсь выше обратного вызова в AppDelegate
классе, это работает просто отлично. Пример, рассмотрите следующее в AppDelegate
классе:
override func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// eventSink!("..."); <--- Trying to achieve this
}
Но здесь вопрос в том, как мне получить доступ к eventSink
инициализированному SwiftMyPlugin
классу.
Попытка 2.1
Я попытался объявить eventSink
как глобальную переменную, но это приводит к inaccessible due to protection level
Попытка 2.2
Flutter
регистратор предоставляет publish
метод, который можно использовать для совместного использования объекта с внешним кодом. Я попытался открыть экземпляр метода SwiftMyPlugin
using registrar.publish
, но не смог получить доступ к его переменной с другой стороны внутри AppDelegate
.
Вопрос
Может ли кто-нибудь указать, как я могу передать данные о намерениях обратно в dart land, как только приложение откроется с помощью намерения пользователя.
Ответ №1:
Для потомков вот как получить ссылку на плагин в AppDelegate:
- Опубликуйте экземпляр плагина во время регистрации как
registrar.publish(instance)
- Доступ к объекту из AppDelegate с помощью
valuePublished(byPlugin: "MyPlugin") as! SwiftMyPlugin
Вызовите общедоступный метод для обработки входящих данных о намерениях пользователя.