18910140161

ios二维码扫描插件 适配当前主流扫描软件自定义扫描界面

顺晟科技

2021-06-16 10:41:27

466

二维码介绍:

二维码,也称为2D条形码,起源于日本。

是按一定规律分布在平面(二维方向)上的黑白图形,是所有信息数据的关键。

二维码是一种比一维码更高的条形码格式。一维码只能在一个方向(一般是水平方向)表达信息,

二维码可以存储水平和垂直方向的信息。一维码只能由数字和字母组成,而二维码可以存储汉字、数字和图片等信息。

所以二维码的应用领域要广得多。

二维码要求:

开发二维码扫描插件,具有扫描公共二维码的能力,可以识别二维码中包含的web链接和文本信息。跳转到safari浏览器获取网页链接(但是连接到您自己的公司需要在应用程序中内置浏览器)。扫描内容会弹出提示框。并且让其他应用扫描我们自己的二维码,跳转到应用商店下载。

需求确认:

二维码算法自己写?不现实。如果开发周期过长,使用第三方库QR(快速响应)代码ZBARSK。阅读信息时,首先要判断是否是网页连接,考虑用正则表达式过滤扫描结果。将webview控件用于内置浏览器。在弹出的提示框中使用UIAlertView太麻烦,不好用,所以采用开源第三方库Blokalertactionsheet,Blokalertactionsheet是一个类似于block制作的UIAlertView UIActionSheet的具有提示功能的控件。很强大很实用。

二维码开发:

首先,在github上下载ZBar SDK

地址https://github.com/bmorton/ZBarSDK

下载BlockAlertActionSheet,

创建新的测试项目。在主故事板上拖放一个按钮,然后点击按钮开始扫描。

按钮连接插座事件。

-(ibaaction)btnclicked :(id)发送者{

}

在项目工程中包含ZBarSDK。添加库:quartzcore.framework,corevideo.framework,coremedia.framework,libiconv.dylib,coregraphics.framework.

在项目工程中包含块警报策略页面

将头文件引入WSQViewController.h

#import 'ZBarSDK.h '

#导入“BlockAlertView.h”

根据协议,

#pragma标记-zbaraderdelegateuiimagepickercontrollerderelegate

-(void)reader controller rdifailtoread :(zbaraderccontroller *)读取器

withRetry: (BOOL)重试

{

}

//二维码

-(void)imagepickercontroller :(UIImagePickerController *)读取器

did finishpicking media withinfo :(NSDictionary *)信息

{

}

定义实例变量:

ZBarReaderViewController *阅读器;

UIView*线;//二维码扫描线。

BOOL是isBottom

NSTimer * lineTimer//二维码扫描线定时器。

自定义二维码扫描界面(思路是先清空阅读器原有的所有界面,再自定义界面,因为ZBarSDK是静态库,)

-(void)setoverlaystyle :(ZBarReaderViewController *)reader _ {

for(UIView * temp in[reader _]。查看子视图]){

for (UIButton* btn在[temp子视图]) {

if([BTN iskindof class :[ui button class]]){

[BTN removeFromSuperiew];

}

}

//移除工具栏

for([temp子视图]中的UIToolbar*工具){

if([tool is kindof class :[UIToolbar class]]){

[工具集hidden : YeS];

[工具removeFromSuperView];

}

}

isBottom=NO

//扫描线

line=[[ui view alloc]initwithframe : cgrectmake(40,105,240,2)];

line . background COlOr=[ui COlOr green COlOr];

[reader_。视图添加子视图:行];

line timer=[NSTimer scheduledtimerwithtimeinterval :1.5 target : self selector : @ selector(move line)user info : nil repeats : YeS];

[LineTiMer fire];

ui image * scanning BG=[ui image imagename d : @ ' scanning-568h . png '];

CGSize size=[ui screen main screen]. bounds . size;

UIImageView * scanning view=[[UIImageView alloc]initwithframe : cgrectmake(0,0,size.width,size . height)];

scanning view . image=scanning BG;

[reader_。视图添加子视图: canning view];

//取消操作按钮

ui button * cancel button=[ui button button with type : ui button typerounddrect];

ui image * bimage=[ui image image name d : @ '黄色按钮。png '];

//[取消按钮设置背景图像: Bimage for state : uicontrolstatenabled];

[取消按钮设置背景颜色:[UIColor white color]];

[取消按钮设置生态器:为状态: ui控件状态正常];

[取消按钮设置框架: cgrectcmake(20,大小。高度- 84,280,40)];

[取消按钮设置:@ '取消对于状态: uicontrolstatenough];

[取消按钮。标题标签设置字体:[UIFont bold system font of size :20]];

[取消按钮为控制事件修饰端添加target : self action : @ selector(siussolveryview :))];

[reader_ .视图添加子视图:取消按钮];

}

}

//屏幕移动扫描线。

-(void)moveLine{

CGRect lineFrame=line.frame

CGFloat y=LineFrame。起源。y;

if(!isBottom) {

是底部=是

y=y 245.0

线条框架。起源。y=y

[ui视图动画持续时间:1.5 animations:^{

line.frame=lineFrame

}];

}else if(isBottom){

isBottom=否

y=y-245;

线条框架。起源。y=y

[ui视图动画持续时间:1.5 animations:^{

line.frame=lineFrame

}];

}

}

//点击取消按钮事件

-(void)suffinsolveryview :(id)发件人{

[LineTiMer无效];

[阅读器dismissmodelview controllerimated : yes];

}

接下来在位置中初始化读者

-(无效)视图加载

{

[super viewDidLoad];

reader=[zbaraderview controller new];

reader.readerDelegate=self

读者。wantsfullsscreenlayout=否;

//隐藏底部控制按钮

reader.showsZBarControls=NO

[self setoverlaystyle : reader];//

ZBarImageScanner * scanner=reader。扫描仪;

[扫描仪设置符号: ZBAR_I25

config: ZBAR_CFG_ENABLE

至: 0];

}

在按钮事件中添加跳转到扫描界面的代码。

-(ibaaction)btnclicked :(id)发送者{

[自我演示视图控制器:阅读器动画:是完成:信息];

}

定义内置留言器WebViewVC.h,拖拽一个使用连接插座变量aWebView。将使用的代表设置为自己

WebViewVC.h遵循协议UIWebViewDelegate,

在WebViewVC.h定义全局变量:@property (nonatomic,retain)NSString * urlStr;

在WebViewVC.h的位置加载网页。

-(无效)视图加载

{

[super viewDidLoad];

if(self。urlstr[self。字符串: @ ' http : ']的urlstr RanGe。长度0){

NSLog(@'%@ ',self。URL str);

NSURL * URL=[NSURL URL tling : self。URL str];

NSLog(@ '用:%@ '打开网站,URL);

nsur请求* request=[带有URl : URl的nsur请求];

_ aWebView=[[UIWebView alloc]initwith frame : self。视图。框架];

_ aWebView.delegate=self

【自我。view add subview : _ aWebView];

[_ aWebView LoadRequest : request];

}

}

最后再WSQViewController.h中处理扫描结果。

在-(void)imagepickercontroller :(UIimagepickercontroller *)读取器

在fo :(NSDictionary *)内完成挑选媒体信息做扫描结果的判断:

#pragma标记-zbaradeldelegateuiimagepickercontrollerderelegate

-(void)读卡器控制器rdifailtoread :(zbaradercontroller *)读取器

带Retry: (BOOL)重试

{

BlockAlertView * Balert=[BlockAlertView alertwithttitle : @]结果:' message:@ '扫描失败,无法读取二维码信息'];

[Balert AddButtonWithTitle : @]知道了方框: nil];

[Balert show];

}

//二维码

-(void)imagepickercontroller :(UIimagepickercontroller *)读取器

在fo :(NSDictionary *)内完成挑选媒体信息

{

//ADD:获取解码结果

idNSFastEnumeration结果=

[info object forkey : zbaradercontrolerresults];

ZBarSymbol *符号=零;

对于(结果中的符号)

打破;

if(符号。数据[符号。字符串: @ ' http : ']的数据范围.长度0)

{

nsstring * regex=@ ' http :[^\\s]*';

n重定向*谓词=[Npredicate Predictewithformat : @ ' SELF MATCHES % @ ',regex];

//正则表达式判断是否包含http:

if([谓词evaluatewithobject :符号。数据])

{

//判断是不是我们自己的二维码

if([符号。字符串: @ ' http://itunes的数据范围。苹果。com/cn/app/id 794862904 ')。长度0[[符号。数据组件由: @ '?'分开] count]1) {

NSString * strUrl=symbol.data

webview cv * web=[[webview cv alloc]initwithninbname : @ ' webview cv ' bundle : nil];

web.urlStr=strUrl

NSLog(@'strurl=%@ ',strUrl);

UInavigationcontroller * Navi=[[UInavigationcontroller alloc]InitWithRootViewcontroller : WeB];

[reader presenteview controller : avi动画: YeS completion : nil];

}else{

[[ui应用程序共享应用程序]OpenURL :[NSURL URLTERRING :符号。数据]];

}

}else{

//不是网页链接的情况。

nsString * MSgbody=[符号。数据字符串百分比擒纵器susingencoding : nsut F8 string encoding];

BlockAlertView * Balert=[BlockAlertView alertwithttitle : @]结果: '消息:消息正文];

[Balert AddButtonWithTitle : @]知道了方框: nil];

[Balert show];

}

} else if([符号。字符串: @ ' @ ']的数据范围.长度0){

NSArray * array=[符号。data ComponentSpaatedBystring : @ ' @ @ '];

NSLog(@'ARRAY=%@ ',ARRAY);

if(数组[数组计数]0)

NSString * msg=[NSString stringwith format : @ ' ',[数组说明]];

BlockAlertView * Balert=[BlockAlertView alertwithttitle : @]结果: '消息:消息];

nsmutatlestring * STrbody=[[nsmutatlestring alloc]initwitchcapacity :3];

for (NSString* str in array) {

NSArray * tempArray=[str componensesparatedbystring : @ '['];

if (tempArray [tempArray计数]0)

nsStrIng * key=[TempArray objectatindex :0];

nsStrIng * value str=[TempArray objectatindex :1];

nsString * value=[[value str ComponentsParatedBystring : @ ']']object atindex :0];

if([key isequaltostring : @ ' URL ']){

[Balert SetCancelButtonWithTitle : @]打开网页block:^{

//在这里打开网页

//[[ui应用程序共享应用程序]OpenURL :[NSURL URltering :值]];

[self OpenWebView of : VaLue];

}];

}

else if([key isequaltoststring : @ ' tel ']){

[Balert SetCancelButtonWithTitle : @]打电话block:^{

//在这里打开网页

NSString * STrtel=[NSString StringWithformat : @ ' tel :/% @ ',value];

[[ui应用程序共享应用程序]open URL :[NSURL URL tling : strtel]];

}];

}

}

}

[Balert show];

}

}

//[reader suisseviewcontrolleranimated : YeS completion : nil];

}

注:

打开应用商店下载应用有两中方式。

种:

itms-app s ://ax/itunes。苹果。请访问www . Microsoft.com/WebObjects/mz store。WOA/wa/viewContentsUserReViews?类型=嫣红Softwareid=794862904?mt=8 '

第二种:

itms-app ://itunes。苹果。com/cn/app/id 794862904?url=http://xyk.cebbank.com,

为了骗过第三方的扫描软件,比如,微信,淘宝,那么必须在连接中加上http://这样才行。

将种方式改成。

http://ax/itunes。苹果。请访问www . Microsoft.com/WebObjects/mz store。WOA/wa/viewContentsUserReViews?类型=嫣红Softwareid=794862904?mt=8 '在微信中还是不跳。

那么就采用第二种方式。

http://itunes.apple.com/cn/app/id794862904?url=http://xyk.cebbank.com

这样的话就很容易的解决了微信扫一扫跳转的问题了,

最开始,我甚至使用的一个网页连接,然后在打开网页的时候让网页重定向,但是微信死活就是不跳转,但是我又发现携程网的应用二维码也是这种方式,携程可以跳,让我纠结了半天。最后查看携程的跳转连接。发现它总共跳转了四次如下,

http://m.ctrip.com/m/c3,

http://m.ctrip.com/market/download.aspx?from=c3,

http://itunes.apple.com/cn/app/id379395415?mt=8,

itms-app ://itunes。苹果。com/cn/app/id 379395415?mt=8,

以我目前的情况是没时间搞它了,不知道有没有大牛给解答一下。

最后附上我写的超文本标记语言跳转页面。

!' DOCTYPE html '

超文本标记语言

身体

脚本类型='text/javascript '

窗户。位置=' mqq : open

窗户。location=' itms-apps ://itunes。苹果。com/cn/app/794862904?mt=8 ';

/script

标签

是事实上是

/标签

/body

/html

附上背景图:

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航