Обработка данных пользователя в Flutter путем вызова EventSink из AppDelegate

#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:

  1. Опубликуйте экземпляр плагина во время регистрации как registrar.publish(instance)
  2. Доступ к объекту из AppDelegate с помощью valuePublished(byPlugin: "MyPlugin") as! SwiftMyPlugin

Вызовите общедоступный метод для обработки входящих данных о намерениях пользователя.