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.
323 lines
12 KiB
323 lines
12 KiB
// |
|
// ScanCodeViewController.m |
|
// LekangGuard |
|
// |
|
// Created by ecell on 2022/10/11. |
|
// |
|
|
|
#import "ScanCodeViewController.h" |
|
#import <AVFoundation/AVFoundation.h> |
|
#import "SelectContactViewController.h" |
|
#import "commWebViewController.h" |
|
#import <SGQRCode/SGQRCode.h> |
|
|
|
|
|
|
|
@interface ScanCodeViewController ()<SGScanCodeDelegate,SGScanCodeSampleBufferDelegate,UITextFieldDelegate> |
|
|
|
/// 识别后的字符串 |
|
@property (strong, nonatomic) NSString *stringValue; |
|
|
|
@property (nonatomic ,strong) SGScanCode *scanCode; |
|
@property (nonatomic, strong) SGScanView *scanView; |
|
|
|
@end |
|
|
|
@implementation ScanCodeViewController |
|
|
|
- (void)viewDidLoad { |
|
[super viewDidLoad]; |
|
// Do any additional setup after loading the view. |
|
self.view.backgroundColor = UIColor.darkTextColor; |
|
self.zx_navTitle = GJText(@"添加设备"); |
|
[self zx_setRightBtnWithText:GJText(@"二维码/条码丢失?") clickedBlock:^(ZXNavItemBtn * _Nonnull btn) { |
|
commWebViewController *vc = [commWebViewController new]; |
|
vc.url = QRcodeLostURLStr; |
|
vc.navTitle = GJText(@"二维码/条码丢失"); |
|
[self.navigationController pushViewController:vc animated:YES]; |
|
}]; |
|
[self.view addSubview:self.scanView]; |
|
|
|
} |
|
|
|
- (void)takeCameraAuthorityStatusCompletion:(void(^)(BOOL allow))completion |
|
{ |
|
//获取摄像头权限当前的状态 |
|
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; |
|
if ((authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied)) |
|
{ |
|
//用户禁止app 访问摄像头 或设置了家长控制 可以根据需求 给用户做一个友好的提示来让用户解除限制 |
|
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:GJText(@"提示") message:F(GJText(@"请为%@打开相机权限"),APPName) preferredStyle:UIAlertControllerStyleAlert]; |
|
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:GJText(@"取消") style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) { |
|
[self.navigationController popViewControllerAnimated:YES]; |
|
}]; |
|
UIAlertAction *confrmAction = [UIAlertAction actionWithTitle:GJText(@"设置") style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) { |
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; |
|
}]; |
|
[alertController addAction:cancelAction]; |
|
[alertController addAction:confrmAction]; |
|
[self presentViewController:alertController animated:YES completion:nil]; |
|
if (completion) { |
|
completion(NO); |
|
} |
|
} |
|
else |
|
{ |
|
//判断是真机还是模拟器 |
|
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { |
|
if (completion) { |
|
completion(YES); |
|
} |
|
} else { |
|
NSLog(@"模拟器中无法打开照相机,请在真机中使用"); |
|
if (completion) { |
|
completion(NO); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
/// 二维码扫描 |
|
- (void)setupCamera |
|
{ |
|
self.scanCode = [[SGScanCode alloc] init]; |
|
if (![self.scanCode checkCameraDeviceRearAvailable]) |
|
return; |
|
self.scanCode.delegate = self; |
|
self.scanCode.sampleBufferDelegate = self; |
|
self.scanCode.preview = self.view; |
|
|
|
UILabel *bottomTitle = [UICommon ui_label:CGRectZero lines:0 align:NSTextAlignmentCenter font:FontADA_(14) textColor:UIColor.whiteColor text:GJText(@"扫描设备背面的二维码或者手动添加设备的IMEI/MEID号") Radius:0]; |
|
[self.view addSubview:bottomTitle]; |
|
[self.view bringSubviewToFront:bottomTitle]; |
|
[bottomTitle mas_makeConstraints:^(MASConstraintMaker *make) { |
|
make.bottom.equalTo(self.view.mas_bottom).inset(Adapted(180)); |
|
make.left.right.equalTo(self.view).inset(25); |
|
make.centerX.equalTo(self.view.mas_centerX); |
|
}]; |
|
|
|
|
|
UIButton *btn = [UICommon ui_buttonSimple:CGRectZero font:FontADA_(15) normalColor:KKWhiteColorColor normalText:GJText(@"手动输入IMEI/MEID") click:^(id x) { |
|
[self stop]; |
|
[self enterIMEIClick]; |
|
}]; |
|
[btn setBackgroundColor:KKMainColor]; |
|
btn.layer.cornerRadius = 3; |
|
btn.layer.masksToBounds = YES; |
|
[self.view addSubview:btn]; |
|
[self.view bringSubviewToFront:btn]; |
|
[btn mas_makeConstraints:^(MASConstraintMaker *make) { |
|
make.top.equalTo(bottomTitle.mas_bottom).offset(50); |
|
make.centerX.equalTo(bottomTitle.mas_centerX); |
|
make.left.right.equalTo(self.view).inset(14); |
|
make.height.offset(Adapted(44)); |
|
}]; |
|
|
|
} |
|
|
|
- (void)scanCode:(SGScanCode *)scanCode result:(NSString *)result |
|
{ |
|
[self stop]; |
|
if (result.length > 0) |
|
{ |
|
NSMutableDictionary *parameters = nil; |
|
if ([result hasPrefix:@"http"]) |
|
{ |
|
parameters = [UICommon getDicWithUrl:result]; |
|
[parameters enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { |
|
if ([[key lowercaseString] isEqualToString:@"imei"]) { |
|
[parameters setObject:obj forKey:@"imei"]; |
|
} |
|
}]; |
|
} |
|
else if (result.length <= 15) |
|
{ |
|
parameters = [NSMutableDictionary dictionaryWithDictionary:@{@"imei":result}]; |
|
} |
|
|
|
if (parameters[@"imei"] != nil) |
|
{ |
|
[self nextActionWithParameters:parameters]; |
|
} |
|
else |
|
{ |
|
EasyAlertView *alertV = [EasyAlertView alertViewWithTitle:GJText(@"提示") subtitle:GJText(@"\n无效的二维码/条码,请重新扫描") AlertViewType:AlertViewTypeSystemAlert config:nil]; |
|
[alertV addAlertItem:^EasyAlertItem *{ |
|
return [EasyAlertItem itemWithTitle:GJText(@"确定") type:AlertItemTypeSystemDefault callback:^(EasyAlertView *showview, long index) { |
|
[self start]; |
|
}]; |
|
}]; |
|
[alertV showAlertView]; |
|
} |
|
} |
|
} |
|
|
|
- (void)scanCode:(SGScanCode *)scanCode brightness:(CGFloat)brightness |
|
{ |
|
|
|
} |
|
|
|
- (void)viewWillAppear:(BOOL)animated { |
|
[super viewWillAppear:animated]; |
|
kWeakSelf(self) |
|
[self takeCameraAuthorityStatusCompletion:^(BOOL allow) { |
|
if (allow) |
|
{ |
|
[weakself setupCamera]; |
|
[weakself start]; |
|
} |
|
}]; |
|
} |
|
|
|
- (void)viewWillDisappear:(BOOL)animated { |
|
[super viewWillDisappear:animated]; |
|
[self stop]; |
|
} |
|
|
|
/// 开始扫描 |
|
- (void)start |
|
{ |
|
[self.scanCode startRunning]; |
|
[self.scanView startScanning]; |
|
} |
|
|
|
/// 停止扫描 |
|
- (void)stop |
|
{ |
|
[self.scanCode stopRunning]; |
|
[self.scanView stopScanning]; |
|
} |
|
|
|
/// 手动输入添加 |
|
- (void)enterIMEIClick |
|
{ |
|
kWeakSelf(self) |
|
UIAlertController *alert = [UIAlertController alertControllerWithTitle:GJText(@"请输入IMEI/MEID号")message:@""preferredStyle:UIAlertControllerStyleAlert]; |
|
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { |
|
textField.keyboardType = UIKeyboardTypeNumberPad; //设置 UIKeyboardTypeNamePhonePad |
|
textField.delegate = self; |
|
}]; |
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:GJText(@"取消") |
|
style:UIAlertActionStyleCancel |
|
handler:^(UIAlertAction * _Nonnull action) { |
|
[self start]; |
|
}]]; |
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:GJText(@"确定") |
|
style:UIAlertActionStyleDefault |
|
handler:^(UIAlertAction * _Nonnull action) |
|
{ |
|
UITextField *textField = alert.textFields[0]; |
|
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:@{@"imei":textField.text}]; |
|
[weakself nextActionWithParameters:parameters]; |
|
}]]; |
|
[self presentViewController:alert animated:YES completion:nil]; |
|
} |
|
|
|
|
|
|
|
#pragma mark 添加学生证 |
|
/// 添加学生证 |
|
- (void)nextActionWithParameters:(NSMutableDictionary *)parameters |
|
{ |
|
[UICommon MessageUpload:@"加载中"]; |
|
[[[APIManager sharedManager] APGET:F(@"%@/%@",ScanDevice_URL, parameters[@"imei"]) parameters:[NSDictionary new] resultClass:ScanCodeModel.class] subscribeNext:^(ScanCodeModel *model) { |
|
[UICommon HidenLoading]; |
|
/// "1"代表已绑定,"0"该设备未绑定,"2"该设备自己已经绑定了 |
|
if (model.binding_status < 2) |
|
{ |
|
SelectContactViewController *vc = [SelectContactViewController new]; |
|
vc.model = model; |
|
vc.imei = parameters[@"imei"]; |
|
[self.navigationController pushViewController:vc animated:YES]; |
|
} |
|
else |
|
{ |
|
[UICommon HidenLoading]; |
|
EasyAlertView *alertV = [EasyAlertView alertViewWithTitle:GJText(@"该设备自己已经绑定了") subtitle:nil AlertViewType:AlertViewTypeSystemAlert config:nil]; |
|
[alertV addAlertItem:^EasyAlertItem *{ |
|
return [EasyAlertItem itemWithTitle:GJText(@"确定") type:AlertItemTypeSystemDefault callback:^(EasyAlertView *showview, long index) { |
|
[self start]; |
|
[UICommon HidenLoading]; |
|
}]; |
|
}]; |
|
[alertV showAlertView]; |
|
} |
|
} error:^(NSError * _Nullable error) { |
|
[UICommon HidenLoading]; |
|
[self start]; |
|
NSDictionary *dic = error.userInfo; |
|
[UICommon MessageErrorText:dic[NSLocalizedDescriptionKey]]; |
|
}]; |
|
} |
|
|
|
|
|
|
|
//MARK: UITextFieldDelegate 限制字数 和输入的 字符 |
|
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ |
|
|
|
|
|
if([@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" containsString:string]){ |
|
// 最终的结果 |
|
NSString *str = textField.text; |
|
NSString *resultStr = [str stringByReplacingCharactersInRange:range withString:string]; |
|
|
|
if(resultStr.length > 15){ |
|
return NO; |
|
}else{ |
|
return YES; |
|
} |
|
}else{ |
|
if([string isEqualToString:@""]){ |
|
return YES; |
|
} |
|
return NO; |
|
} |
|
} |
|
|
|
- (SGScanView *)scanView |
|
{ |
|
if (!_scanView) |
|
{ |
|
SGScanViewConfigure *configure = [[SGScanViewConfigure alloc] init]; |
|
|
|
CGFloat x = 0; |
|
CGFloat y = 0; |
|
CGFloat w = self.view.frame.size.width; |
|
CGFloat h = self.view.frame.size.height; |
|
_scanView = [[SGScanView alloc] initWithFrame:CGRectMake(x, y, w, h) configure:configure]; |
|
|
|
CGFloat scan_x = 0; |
|
CGFloat scan_y = 0.18 * self.view.frame.size.height; |
|
CGFloat scan_w = self.view.frame.size.width - 2 * x; |
|
CGFloat scan_h = self.view.frame.size.height - 2.55 * scan_y; |
|
_scanView.scanFrame = CGRectMake(scan_x, scan_y, scan_w, scan_h); |
|
|
|
__weak typeof(self) weakSelf = self; |
|
_scanView.doubleTapBlock = ^(BOOL selected) { |
|
__strong typeof(weakSelf) strongSelf = weakSelf; |
|
|
|
if (selected) { |
|
[strongSelf->_scanCode setVideoZoomFactor:4.0]; |
|
} else { |
|
[strongSelf->_scanCode setVideoZoomFactor:1.0]; |
|
} |
|
}; |
|
} |
|
return _scanView; |
|
} |
|
|
|
/* |
|
#pragma mark - Navigation |
|
|
|
// In a storyboard-based application, you will often want to do a little preparation before navigation |
|
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { |
|
// Get the new view controller using [segue destinationViewController]. |
|
// Pass the selected object to the new view controller. |
|
} |
|
*/ |
|
|
|
@end
|
|
|