The QR Code Scanner package for Appeto SDK.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
5.0 KiB

  1. //
  2. // QRView.swift
  3. // flutter_qr
  4. //
  5. // Created by Julius Canute on 21/12/18.
  6. //
  7. import Foundation
  8. import MTBBarcodeScanner
  9. public class QRView:NSObject,FlutterPlatformView {
  10. @IBOutlet var previewView: UIView!
  11. var scanner: MTBBarcodeScanner?
  12. var registrar: FlutterPluginRegistrar
  13. var channel: FlutterMethodChannel
  14. public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64){
  15. self.registrar = registrar
  16. previewView = UIView(frame: frame)
  17. channel = FlutterMethodChannel(name: "net.touchcapture.qr.flutterqr/qrview_\(id)", binaryMessenger: registrar.messenger())
  18. }
  19. func isCameraAvailable(success: Bool) -> Void {
  20. if success {
  21. do {
  22. try scanner?.startScanning(resultBlock: { codes in
  23. if let codes = codes {
  24. for code in codes {
  25. var typeString: String;
  26. switch(code.type) {
  27. case AVMetadataObject.ObjectType.aztec:
  28. typeString = "AZTEC"
  29. case AVMetadataObject.ObjectType.code39:
  30. typeString = "CODE_39"
  31. case AVMetadataObject.ObjectType.code93:
  32. typeString = "CODE_93"
  33. case AVMetadataObject.ObjectType.code128:
  34. typeString = "CODE_128"
  35. case AVMetadataObject.ObjectType.dataMatrix:
  36. typeString = "DATA_MATRIX"
  37. case AVMetadataObject.ObjectType.ean8:
  38. typeString = "EAN_8"
  39. case AVMetadataObject.ObjectType.ean13:
  40. typeString = "EAN_13"
  41. case AVMetadataObject.ObjectType.itf14:
  42. typeString = "ITF"
  43. case AVMetadataObject.ObjectType.pdf417:
  44. typeString = "PDF_417"
  45. case AVMetadataObject.ObjectType.qr:
  46. typeString = "QR_CODE"
  47. case AVMetadataObject.ObjectType.upce:
  48. typeString = "UPC_E"
  49. default:
  50. return
  51. }
  52. guard let stringValue = code.stringValue else { continue }
  53. let result = ["code": stringValue, "type": typeString]
  54. self.channel.invokeMethod("onRecognizeQR", arguments: result)
  55. }
  56. }
  57. })
  58. } catch {
  59. NSLog("Unable to start scanning")
  60. }
  61. } else {
  62. UIAlertView(title: "Scanning Unavailable", message: "This app does not have permission to access the camera", delegate: nil, cancelButtonTitle: nil, otherButtonTitles: "Ok").show()
  63. }
  64. }
  65. public func view() -> UIView {
  66. channel.setMethodCallHandler({
  67. [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
  68. switch(call.method){
  69. case "setDimensions":
  70. var arguments = call.arguments as! Dictionary<String, Double>
  71. self?.setDimensions(width: arguments["width"] ?? 0,height: arguments["height"] ?? 0)
  72. case "flipCamera":
  73. self?.flipCamera()
  74. case "toggleFlash":
  75. self?.toggleFlash()
  76. case "pauseCamera":
  77. self?.pauseCamera()
  78. case "resumeCamera":
  79. self?.resumeCamera()
  80. default:
  81. result(FlutterMethodNotImplemented)
  82. return
  83. }
  84. })
  85. return previewView
  86. }
  87. func setDimensions(width: Double, height: Double) -> Void {
  88. previewView.frame = CGRect(x: 0, y: 0, width: width, height: height)
  89. scanner = MTBBarcodeScanner(previewView: previewView)
  90. MTBBarcodeScanner.requestCameraPermission(success: isCameraAvailable)
  91. }
  92. func flipCamera(){
  93. if let sc: MTBBarcodeScanner = scanner {
  94. if sc.hasOppositeCamera() {
  95. sc.flipCamera()
  96. }
  97. }
  98. }
  99. func toggleFlash(){
  100. if let sc: MTBBarcodeScanner = scanner {
  101. if sc.hasTorch() {
  102. sc.toggleTorch()
  103. }
  104. }
  105. }
  106. func pauseCamera() {
  107. if let sc: MTBBarcodeScanner = scanner {
  108. if sc.isScanning() {
  109. sc.freezeCapture()
  110. }
  111. }
  112. }
  113. func resumeCamera() {
  114. if let sc: MTBBarcodeScanner = scanner {
  115. if !sc.isScanning() {
  116. sc.unfreezeCapture()
  117. }
  118. }
  119. }
  120. }