顺晟科技
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
附上背景图:
08
2022-03
29
2021-08
28
2021-08
03
2021-08
16
2021-06
16
2021-06