Магазин Swift 5, пока все приложение не будет инициализировано - PullRequest
0 голосов
/ 01 марта 2020

Я работаю над собственным плагином Ionic / Capacitor в Swift

Я пытаюсь интегрировать службу уведомлений OneSignal pu sh, мой код ниже работает просто отлично, если приложение находится на переднем плане, и пользователь нажимает однако уведомление, если приложение запускается нажатием на уведомление, что мои события не запускаются, я полагаю, что это происходит потому, что AppDelegate.swift загружается до Capacitor / Ioni c, а когда мой NotificationCenter.default.post запускается, данные не доходят до моего плагина.

Наверное, я хочу знать, есть ли какой-нибудь способ в Swift сохранить эти данные поста, пока все части приложения не загрузятся и не будут инициализированы, например, веб-просмотр Capacitor / Ionics

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


        let notificationOpenedBlock: OSHandleNotificationActionBlock = { result in
           // This block gets called when the user reacts to a notification received
           let payload: OSNotificationPayload = result!.notification.payload

           var fullMessage = payload.body

            let nc = NotificationCenter.default
                nc.post(name: Notification.Name("TestingEvents"), object: nil)

           if payload.additionalData != nil {
              if payload.title != nil {
                 let messageTitle = payload.title
                    print("Message Title = \(messageTitle!)")
              }

              let additionalData = payload.additionalData
              if additionalData?["actionSelected"] != nil {
                 fullMessage = fullMessage! + "\nPressed ButtonID: \(additionalData!["actionSelected"])"
              }
           }
        }


    return true
  }

MyPlugin.swift

    public override func load() {
        let nc = NotificationCenter.default
            nc.addObserver(self, selector: #selector(handleSignal), name: Notification.Name("TestingEvents"), object: nil)
    }

    @objc func handleSignal() {
        self.bridge.triggerWindowJSEvent(eventName: "myCustomEvent")
        self.notifyListeners("myPluginEvent", data: [:])
    }

и мой app.component.ts

      window.addEventListener('myCustomEvent', () => {
        alert("myCustomEvent ")
      });            
      Plugins.myPlugin.addListener("myPluginEvent", () => {
        alert("myPluginEvent ")
      });

1 Ответ

0 голосов
/ 03 марта 2020

это логическая проблема.
Здесь вы можете сохранить данные уведомления (OSNotificationPayload) в объекте / словаре / массиве, который вы получите в didFinishLaunchingWithOptions , и добавить наблюдателя "HandleNotificaionAfterPluginSetup" до appdelegate . Для этого наблюдателя вы можете инициировать пост-уведомление от вашего плагина, как только он будет инициализирован и у вас будет все готово для обработки уведомлений.
как только вы все настроили в своем плагине и запустили уведомление, которое код может выполнить в обработчике уведомлений, который вы только что установили, который выполнит код

              if payload.title != nil {
                 let messageTitle = payload.title
                    print("Message Title = \(messageTitle!)")
              }
              let additionalData = payload.additionalData
              if additionalData?["actionSelected"] != nil {
                 fullMessage = fullMessage! + "\nPressed ButtonID: \(additionalData!["actionSelected"])"
              }
           }```
...