1
1
import Flutter
2
2
import UIKit
3
+ import Vision
3
4
4
5
public class SwiftScanPlugin : NSObject , FlutterPlugin {
5
6
public static func register( with registrar: FlutterPluginRegistrar ) {
@@ -16,11 +17,10 @@ public class SwiftScanPlugin: NSObject, FlutterPlugin {
16
17
} else if call. method== " parse " {
17
18
let path = call. arguments as! String ;
18
19
if let features = self . detectQRCode ( UIImage . init ( contentsOfFile: path) ) , !features. isEmpty {
19
- for case let row as CIQRCodeFeature in features{
20
- result ( row. messageString) ;
21
- }
20
+ let data = features. first as! CIQRCodeFeature
21
+ result ( data. messageString) ;
22
22
} else {
23
- result ( nil ) ;
23
+ self . detectBarCode ( UIImage . init ( contentsOfFile : path ) , result : result )
24
24
}
25
25
}
26
26
}
@@ -41,4 +41,36 @@ public class SwiftScanPlugin: NSObject, FlutterPlugin {
41
41
}
42
42
return nil
43
43
}
44
+
45
+ private func detectBarCode( _ image: UIImage ? , result: @escaping FlutterResult ) {
46
+ if let image = image, let ciImage = CIImage . init ( image: image) , #available( iOS 11 . 0 , * ) {
47
+ var requestHandler : VNImageRequestHandler ;
48
+ if ciImage. properties. keys. contains ( ( kCGImagePropertyOrientation as String ) ) {
49
+ requestHandler = VNImageRequestHandler ( ciImage: ciImage, orientation: CGImagePropertyOrientation ( rawValue: ciImage. properties [ ( kCGImagePropertyOrientation as String ) ] as! UInt32 ) ?? . up, options: [ : ] )
50
+ } else {
51
+ requestHandler = VNImageRequestHandler ( ciImage: ciImage, orientation: . up, options: [ : ] )
52
+ }
53
+ let request = VNDetectBarcodesRequest { ( request, error) in
54
+ var res : String ? = nil ;
55
+ if let observations = request. results as? [ VNBarcodeObservation ] , !observations. isEmpty {
56
+ let data : VNBarcodeObservation = observations. first!;
57
+ res = data. payloadStringValue;
58
+ }
59
+ DispatchQueue . main. async {
60
+ result ( res) ;
61
+ }
62
+ }
63
+ DispatchQueue . global ( qos: . background) . async {
64
+ do {
65
+ try requestHandler. perform ( [ request] )
66
+ } catch {
67
+ DispatchQueue . main. async {
68
+ result ( nil ) ;
69
+ }
70
+ }
71
+ }
72
+ } else {
73
+ result ( nil ) ;
74
+ }
75
+ }
44
76
}
0 commit comments