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

//
// 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