1 | // Copyright 2016-present 650 Industries. All rights reserved.
|
2 |
|
3 | #import <EXBarCodeScanner/EXBarCodeScannerModule.h>
|
4 | #import <EXBarCodeScanner/EXBarCodeScannerUtils.h>
|
5 | #import <UMImageLoaderInterface/UMImageLoaderInterface.h>
|
6 |
|
7 | @interface EXBarCodeScannerModule ()
|
8 |
|
9 | @property (nonatomic, weak) UMModuleRegistry *moduleRegistry;
|
10 | @property (nonatomic, weak) id<UMImageLoaderInterface> imageLoader;
|
11 |
|
12 | @end
|
13 |
|
14 | @implementation EXBarCodeScannerModule
|
15 |
|
16 | UM_EXPORT_MODULE(ExpoBarCodeScannerModule);
|
17 |
|
18 | - (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry
|
19 | {
|
20 | _moduleRegistry = moduleRegistry;
|
21 | _imageLoader = [moduleRegistry getModuleImplementingProtocol:@protocol(UMImageLoaderInterface)];
|
22 | }
|
23 |
|
24 | - (NSDictionary *)constantsToExport
|
25 | {
|
26 | return @{
|
27 | @"Type": @{
|
28 | @"front": @(EXCameraTypeFront),
|
29 | @"back" : @(EXCameraTypeBack),
|
30 | },
|
31 | @"BarCodeType": [EXBarCodeScannerUtils validBarCodeTypes],
|
32 | };
|
33 | }
|
34 |
|
35 | UM_EXPORT_METHOD_AS(scanFromURLAsync,
|
36 | scanFromURLAsync:(NSString *)url
|
37 | barCodeTypes:(NSArray *)barCodeTypes
|
38 | resolver:(UMPromiseResolveBlock)resolve
|
39 | rejecter:(UMPromiseRejectBlock)reject)
|
40 | {
|
41 | // We only support QR codes, so barCodeTypes is ignored
|
42 | NSURL *imageURL = [NSURL URLWithString:url];
|
43 | [_imageLoader loadImageForURL:imageURL completionHandler:^(NSError *error, UIImage *loadedImage) {
|
44 | if (error != nil) {
|
45 | reject(@"E_IMAGE_RETRIEVAL_ERROR", @"Could not get the image", error);
|
46 | return;
|
47 | }
|
48 |
|
49 | CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode
|
50 | context:nil
|
51 | options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
|
52 | if (detector) {
|
53 | NSArray *features = [detector featuresInImage:[[CIImage alloc] initWithCGImage:loadedImage.CGImage]];
|
54 |
|
55 | NSMutableArray *result = [NSMutableArray arrayWithCapacity:1];
|
56 | for (CIQRCodeFeature *feature in features) {
|
57 | [result addObject:@{
|
58 | @"type" : AVMetadataObjectTypeQRCode,
|
59 | @"data" : feature.messageString
|
60 | }];
|
61 | }
|
62 |
|
63 | resolve(result);
|
64 | } else {
|
65 | reject(@"E_SCANNER_INIT_FAILED", @"Could not initialize the barcode scanner", nil);
|
66 | }
|
67 | }];
|
68 | }
|
69 |
|
70 | @end
|