Флаттер добавляет новый ViewController для плагина BlinkId - PullRequest
1 голос
/ 23 марта 2020

Я работаю над приложением флаттера, и у меня есть tp integrate Плагин BlinkId для сканирования документов, которые не имеют плагина флаттера, поэтому я использовал MethodChannel для вызова метода в нативном коде, а затем попытался добавить родной код плагина.

все работает, и открывается плагин, и сканирование успешно выполняется, но просмотр сканирования не закрывается вообще, даже если я нажимаю закрыть, что предполагает отменить сканирование.

Кажется, что ни один из методов не работает, кроме viewdidload, но не работает сканирование по умолчанию или didtabclose.

вот мой код:

import UIKit
import Flutter
import GoogleMaps
import Microblink
var _result: FlutterResult?

@UIApplicationMain
 @objc class AppDelegate: FlutterAppDelegate {

override func application(
 _ application: UIApplication,
 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
 ) -> Bool {
  let controller : FlutterViewController = window?.rootViewController as! FlutterViewController



  let scanIdChannel = FlutterMethodChannel(name: "native.wasfago.scanId",
                                            binaryMessenger: controller.binaryMessenger)
  scanIdChannel.setMethodCallHandler({
  (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
    // Note: this method is invoked on the UI thread.
    guard call.method == "scanId" else {
      result(FlutterMethodNotImplemented)
      return
    }
    _result = result
    self.scanId(result: result) // handle click event from flutter button
    print("clicked!")

  })
  GeneratedPluginRegistrant.register(with: self)
  return super.application(application, didFinishLaunchingWithOptions: launchOptions)
 }
 private func scanId(result: FlutterResult) {

    let viewCtrl = ViewController()
    topMostController().view.addSubview(viewCtrl.view)

 }
 func topMostController() -> UIViewController {
       var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
       while ((topController?.presentedViewController) != nil) {
           topController = topController?.presentedViewController

       }
       return topController!
   }
}

class ViewController: UIViewController ,MBBlinkIdOverlayViewControllerDelegate{
   func blinkIdOverlayViewControllerDidTapClose(_ blinkIdOverlayViewController: MBBlinkIdOverlayViewController) {
    print("Closed!!!!!!!!!")
   }


   var blinkIdRecognizer : MBBlinkIdCombinedRecognizer?

   override func viewDidLoad() {
      super.viewDidLoad()
      // Valid until: 2020-06-26

      self.didTapScan()
      print("View Loaded!")
   }

   @IBAction func didTapScan() {
MBMicroblinkSDK.sharedInstance().setLicenseKey("sRwAAAEPY29tLnczNC53YXNmYWdvfIRuYWSSC81qt+lUDRzpTwtWuUsIPrIHmH2dNCTjx5qYKCfr3nKw9UVE7TIRv2nq/jDlTtqhcVZA+4dyVG8moP4DeOygPcRAkdy6L+WpNhacuZMjrTAUmGwooe3CSzaj8D8Y6Znf98SHVIE9bxdSv23SOfCQnNsoCSksIYvpjVjpT5DUExr6qSY+QqeH3EUxDR9GqIPgeiEGIXZUeOdqnIyNiGH8PYpfF9Uv79HEacBncbHDMwfzZTSXc2VYttRgae1QAA9h5hAtUc8VhH1g")
    /** Create BlinkID recognizer */
    self.blinkIdRecognizer = MBBlinkIdCombinedRecognizer()
    self.blinkIdRecognizer?.returnFullDocumentImage = true;

    /** Create settings */
    let settings : MBBlinkIdOverlaySettings = MBBlinkIdOverlaySettings()

    /** Crate recognizer collection */
    let recognizerList = [self.blinkIdRecognizer!]
    let recognizerCollection : MBRecognizerCollection = MBRecognizerCollection(recognizers: recognizerList)

    /** Create your overlay view controller */
    let blinkIdOverlayViewController : MBBlinkIdOverlayViewController = MBBlinkIdOverlayViewController(settings: settings, recognizerCollection: recognizerCollection, delegate: self)

    /** Create recognizer view controller with wanted overlay view controller */
    let recognizerRunneViewController : UIViewController = MBViewControllerFactory.recognizerRunnerViewController(withOverlayViewController: blinkIdOverlayViewController)
    recognizerRunneViewController.modalPresentationStyle = .fullScreen

    /** Present the recognizer runner view controller. You can use other presentation methods as well (instead of presentViewController) */
    self.topMostController().present(recognizerRunneViewController, animated: true, completion: nil)

//    let navigationController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController
 //   navigationController?.pushViewController(recognizerRunneViewController, animated: true)


}

    func topMostController() -> UIViewController {
      var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
      while ((topController?.presentedViewController) != nil) {
        topController = topController?.presentedViewController
      }
      return topController!
    }
    func blinkIdOverlayViewControllerDidFinishScanning(_ blinkIdOverlayViewController: MBBlinkIdOverlayViewController, state: MBRecognizerResultState) {
        /** This is done on background thread */
        print("success scaning");          

    }

}

1 Ответ

3 голосов
/ 02 апреля 2020

Вы должны удалить промежуточный экземпляр ViewController и представить recognizerRunneViewController (который отвечает за сканирование идентификатора) поверх либо UINavigationViewController, либо модально непосредственно над topMostViewController.

Вот ссылка на проблему GitHub, которая помогла с решением: https://github.com/BlinkID/blinkid-ios/issues/294

...