亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS 二維碼掃描和應用跳轉

2020-07-26 02:52:24
字體:
來源:轉載
供稿:網友

前面我們已經調到過怎么制作二維碼,在我們能夠生成二維碼之后,如何對二維碼進行掃描呢?

在iOS7之前,大部分應用中使用的二維碼掃描是第三方的掃描框架,例如ZXing或者ZBar。使用時集成麻煩,出錯也不方便調試。在iOS7之后,蘋果自身提供了二維碼的掃描功能,從效率上來說,原生的二維碼遠高于這些第三方框架。本文講解如何使用原生框架實現二維碼掃描功能,并且進行掃描后的項目跳轉。

掃描相關類

二維碼掃描需要獲取攝像頭并讀取照片信息,因此我們需要導入系統的AVFoundation框架,創建視頻會話。我們需要用到一下幾個類:

  • AVCaptureSession 會話對象。此類作為硬件設備輸入輸出信息的橋梁,承擔實時獲取設備數據的責任
  • AVCaptureDeviceInput 設備輸入類。這個類用來表示輸入數據的硬件設備,配置抽象設備的port
  • AVCaptureMetadataOutput 輸出類。這個支持二維碼、條形碼等圖像數據的識別
  • AVCaptureVideoPreviewLayer 圖層類。用來快速呈現攝像頭獲取的原始數據 二維碼掃描功能的實現步驟是創建好會話對象,用來獲取從硬件設備輸入的數據,并實時顯示在界面上。在掃描到相應圖像數據的時候,通過AVCaptureVideoPreviewLayer類型進行返回

應用跳轉

在使用第三方登陸、分享sdk的時候,我們的項目會在本機安裝有目標平臺的應用的情況下進行應用跳轉,并且傳遞信息過去。這在沙盒機制下的iOS應用而言,理應是不符合規則的。但是,iOS SDK給我們提供了一個叫做url scheme的機制來實現這個功能。

url scheme讓我們可以像使用Safari打開網頁的方式跳轉到其他應用中,并使用類似網絡請求的GET請求的參數拼湊方式來在不同應用之間傳遞數據。

使用url scheme的第一步是在項目的info.plist文件中添加新row,命名為URL types

展開新增的字典,我們修改其中的URL Identifier以及新增加一個字段

URL Schemes。

Identifier用來跳轉后,讓跳轉應用識別從哪里跳轉過來的,我們可以設置為bundleID反轉,來確保其特殊性。

URL Schemes是一個數組,我們將在這個數組里面自定義自己的url schemes,這里我們填寫應用名。最終效果如下:

接著,我們就可以在其他應用中通過openURL:方法打開我們的app。

二維碼掃描

二維碼掃描的步驟:

1、創建設備會話對象,用來設置設備數據輸入

2、獲取攝像頭,并且將攝像頭對象加入當前會話中

3、實時獲取攝像頭原始數據顯示在屏幕上

4、掃描到二維碼/條形碼數據,通過協議方法回調

(1)會話對象AVCaptureSession的創建

_session = [AVCaptureSession new];[_session setSessionPreset: AVCaptureSessionPresetHigh]; //高質量采集[self setupIODevice];

(2)setupIODevice方法中懶加載方式創建輸入對象和輸出對象,注意必須在輸出數據對象加入到當前會話后才能設置識別的數據格式。這里設置為掃描二維碼以及條形碼

[_session addInput: self.input];[_session addOutput: self.output];_output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];

(3)創建AVCaptureMetadataOutput設置好掃描成功回調代理以及回調線程

_output = [AVCaptureMetadataOutput new];[_output setMetadataObjectsDelegate: self queue: dispatch_get_main_queue()];

(4)創建AVCaptureDeviceInput輸入設備為手機攝像頭

AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];_input = [AVCaptureDeviceInput deviceInputWithDevice: device error: nil];

(5)創建AVCaptureVideoPreviewLayer對象來實時獲取攝像頭圖像,我們需要調用[self.view addSubview: self.scanView]把攝像頭獲取的圖像實時展示在屏幕上

_scanView = [AVCaptureVideoPreviewLayer layerWithSession: self.session];_scanView.videoGravity = AVLayerVideoGravityResizeAspectFill;_scanView.frame = self.bounds;

(6)實現captureOutput: didOutputMetadataObjects: fromConnection:來獲取掃描得到的數據?;卣{參數metadataObjects中存放了掃描結果,我們需要先判斷這個數組的數據個數不為0再執行下面的代碼:

[self stop];AVMetadataMachineReadableCodeObject * metadataObject = metadataObjects[0];if ([self.delegate respondsToSelector: @selector(scanView:codeInfo:)]) { [self.delegate scanView: self codeInfo: metadataObject.stringValue]; [self removeFromSuperview];} else { [[NSNotificationCenter defaultCenter] postNotificationName: LXDSuccessScanQRCodeNotification object: self userInfo: @{ LXDScanQRCodeMessageKey: metadataObject.stringValue }];

讀取二維碼信息進行應用跳轉

首先要說明的是,二維碼并非一定要存儲應用的url scheme。例如公眾號的二維碼,雖然不知道是怎樣的數據存儲,但肯定不是應用跳轉??梢越o自己的應用指定一個二維碼數據規則,例如支付寶付款掃描是讀取商品的ID、價格等信息,然后進行頁面跳轉付款。

這里我們使用上面設置的url scheme,我們通過制作二維碼方法來定制一個存儲應用跳轉信息的二維碼,通過下面的代理創建一個存儲url scheme(使用url scheme的時候要注意在后面加上://后才能使用openURL進行跳轉)的二維碼,這一步應該放到模擬器上面生成

- (IBAction)createBarcode:(id)sender { UIImage * image = [UIImage imageOfQRFromURL: @"LXDDrawLosts://" codeSize: 160.f red: 123 green: 189 blue: 229 insertImage: nil]; CGSize size = image.size; UIImageView * imageView = [[UIImageView alloc] initWithFrame: ((CGRect){(CGPointZero), (size)})]; imageView.center = self.view.center; imageView.image = image; [self.view addSubview: imageView];}

創建二維碼掃描控制器,然后對我們生成的二維碼進行掃描(這一步要在真機上面完成,上面url scheme的應用應當通過xcode安裝在手機上,才能完成跳轉)

LXDScanCodeController * scanCodeController = [LXDScanCodeController scanCodeController];scanCodeController.scanDelegate = self;[self.navigationController pushViewController: scanCodeController animated: YES];

掃描成功后判斷是否可以打開跳轉,如果你的應用有一套二維碼數據存儲的規則,那么在不能跳轉的時候應該按照這套規則解析數據。這里我直接在無法跳轉的情況下顯示警告框告訴用戶無法解析二維碼:

NSURL * url = [NSURL URLWithString: codeInfo];if ([[UIApplication sharedApplication] canOpenURL: url]) { [[UIApplication sharedApplication] openURL: url];} else { UIAlertView ** * alertView = [[UIAlertView alloc] initWithTitle: @"警告" message: [NSString stringWithFormat: @"%@:%@", @"無法解析的二維碼", codeInfo] delegate: nil cancelButtonTitle: @"確定" otherButtonTitles: nil]; [alertView show];}

按照上面的步驟進行的話,那么在你掃完二維碼之后,你的手機就會跳轉到剛才設置url scheme的應用中。

掃描優化

上面已經完成了二維碼的掃描功能實現,但是現在你會發現我們在使用上面代碼進行掃描的時候,整個屏幕都是掃描范圍,這樣會影響掃描的準確性以及我們調整掃描范圍的難度。

蘋果提供了一種方式讓我們規定掃描范圍:在AVCaptureMetadataOutput中有一個叫做rectOfInterest的CGRect類型屬性,這個屬性用來限制掃描范圍。

這個屬性的每一個值取值范圍在0~1之間,代表的是對應軸上的比例大小。最開始我以為這個是以左上角為原點,后來設置為CGRectMake(0.3, 0.35, 0.4, 0.3)發現和預期的不一樣,因為這個屬性是以屏幕右上角為坐標原點,并且寬高的順序要對換過來

如圖所示,由于坐標系的不同,原本CGRectMake(0.3, 0.35, 0.4, 0.3)到了新坐標系中就變成了CGRectMake(0.35, 0.3, 0.3, 0.4)。那么大家設置成新的掃描范圍之后,重新運行掃描程序,看看效果――然而,我們發現并不能掃描成功,這是因為這個掃描區域不僅僅是坐標系原點發生了改變。如下圖所示

按照上面CGRect的設置,我是想要把掃描范圍控制在屏幕x軸上面0.3-0.7,y軸上0.35-0.65之間的范圍。但是在這個屬性中,width和height分別表示的是在rectOfInterest坐標中掃描矩形右下角的坐標點位置。因此,這個掃描范圍應該是CGRectMake(0.35, 0.3, 0.65, 0.7)。除了設置好掃描范圍之內,我們還可以仿照微信的掃描,給非掃描范圍加上一層半透明的黑色layer

應用傳值

前面說過,url scheme不僅僅支持應用跳轉,它還支持使用類似get請求的方式在應用間傳值。上面跳轉的url scheme是LXDDrawLosts://,那么類似get請求,我們在這個字符串后面加上一個?表示區分開參數和應用id,使用&分隔不同參數,然后后面按照字段名=屬性值的方式拼湊鏈接。

比如,假設這是一個即時通訊app,那么我可以制定這樣的一個跳轉參數規則:

  • method 表示操作類型
  • userId 用戶id
  • title 分享標題
  • message 分享消息
  • link_url 分享鏈接

那么,如果傳入的是

LXDDrawLosts://?method=addFriends&userId=10086

這可能代表的是掃描后添加id為10086的新好友。

又比如

LXDDrawLosts://?method=shareMessage&title=分享測試&message=這是林欣達的分享測試&link_url=http://www.jianshu.com/users/0cf7d455eb9e/latest_articles

這代表分享信息到你的app中。這些都是我們自己的應用可以制定的規則,如果有興趣,可以新浪微博開放平臺或者騰訊開放平臺,他們的文檔中應該有url scheme的傳值標準。

說完了通過url scheme傳入參數后,怎么把這些參數取出來呢?AppDelegate中提供了application:openURL: sourceApplication: annotation:方法讓我們可以取出傳入的值。

在我們通過url scheme跳轉到本應用的時候,這個方法就會被系統調用。其中,有兩個重要的參數需要我們知道

  • sourceApplication 這個字符串保存了跳轉方app的url Identifier,就是上文中除了url scheme以外的另一個字段
  • url 這個鏈接中存儲了跳轉的url scheme以及參數列表,我們通過[url scheme]方法獲取前者;用[url query]方法獲取?之后的參數列表,然后使用字符串的分隔方法把這些數據讀取出來

單純的二維碼數據并沒有過于強大的功能,但結合了url scheme的跳轉機制后,二維碼能夠幫助我們的應用獲得更加強大的能力,使得我們的應用之間有了更多聯系。

本文demo:二維碼掃描集成

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色青青草原桃花久久综合| 亚洲激情第一页| 欧美怡红院视频一区二区三区| 国产在线观看精品一区二区三区| 国产一区二区三区在线观看网站| 久久久久久12| 日韩av片永久免费网站| 日韩欧美在线国产| 7m精品福利视频导航| xvideos亚洲| 国产精品都在这里| 精品网站999www| 欧美猛交免费看| 亚洲视频自拍偷拍| 久久国产精品免费视频| 亚洲精品99999| 亚洲自拍欧美色图| 久久视频中文字幕| 欧美亚洲成人免费| 911国产网站尤物在线观看| 亚洲一区二区三区成人在线视频精品| 亚洲成人性视频| 国产精品一二区| 91精品中国老女人| 欧美成年人视频网站欧美| 亚洲第一男人天堂| 国产精品人成电影在线观看| 91美女高潮出水| 欧美精品18videos性欧| 91av在线播放| 中文字幕一区二区精品| xx视频.9999.com| 亚洲色图35p| 91日本在线观看| 亚洲第一男人天堂| 日本久久91av| 国产成人精品视频| 国产精品一区二区久久久| 国产一区二区三区四区福利| 国产精品免费视频久久久| 91视频国产高清| 亚洲日本成人网| 九九热这里只有精品免费看| 日韩在线观看你懂的| 91高潮在线观看| 日韩在线观看成人| 亚州国产精品久久久| 成人福利网站在线观看11| 91精品国产免费久久久久久| 欧美成人亚洲成人日韩成人| 欧美与黑人午夜性猛交久久久| 久久成人在线视频| 91丝袜美腿美女视频网站| 色噜噜亚洲精品中文字幕| 欧美性xxxx极品高清hd直播| 亚洲精品国产精品国产自| 成人网在线视频| 久久久国产一区二区三区| 欧美中文在线免费| 日本一欧美一欧美一亚洲视频| 秋霞成人午夜鲁丝一区二区三区| 在线看片第一页欧美| 久久成年人视频| 成人福利视频在线观看| 在线看国产精品| 欧美日韩成人精品| 日韩av理论片| 欧美视频专区一二在线观看| 九九热精品视频在线播放| 久久99视频精品| 国产亚洲人成a一在线v站| 九九久久综合网站| 国产亚洲精品久久久久久牛牛| 欧美成人精品一区二区三区| 国产精品视频网址| 欧美精品制服第一页| 国产精品视频一| 91日韩在线播放| 欧美激情欧美激情在线五月| 国产精品国产自产拍高清av水多| 欧美日韩国产综合视频在线观看中文| 日韩精品中文字幕在线| 伊是香蕉大人久久| 国产精品一区二区3区| 欧美一级片久久久久久久| 欧美性猛交丰臀xxxxx网站| 国产在线观看91精品一区| 精品一区二区亚洲| 欧美激情精品久久久久久蜜臀| 欧美在线视频一区二区| 一区二区三区国产在线观看| 国产精品入口免费视频一| 亚洲二区中文字幕| 日韩黄色在线免费观看| 久久久爽爽爽美女图片| 大胆欧美人体视频| 一区二区亚洲精品国产| 久久精品视频导航| 亚洲国产一区二区三区在线观看| 亚洲国产高潮在线观看| 久久国产精品首页| 91福利视频在线观看| 国产91精品久久久久久| 成人免费网站在线| 人体精品一二三区| 欧美国产日韩免费| 成人性教育视频在线观看| 亚洲自拍在线观看| xxxx欧美18另类的高清| 欧美在线性视频| 国产一区二区三区免费视频| 亚洲欧美国产另类| 黄色一区二区在线观看| 欧美成人在线影院| 亚洲人成网站免费播放| 91系列在线观看| 精品久久久久久| 伊人久久久久久久久久久久久| 伊人一区二区三区久久精品| 精品成人乱色一区二区| 欧美日韩亚洲高清| 亚洲视频在线观看免费| 午夜精品福利电影| 日韩欧美国产成人| 国产日韩欧美在线观看| 国产精品久久久久久超碰| 亚洲激情自拍图| 欧美激情一级精品国产| 日韩中文字在线| 国产成人拍精品视频午夜网站| 国产精品吴梦梦| 欧美日韩久久久久| 国外色69视频在线观看| 国产视频欧美视频| 亚洲成人av在线播放| 亚洲一级一级97网| 色妞久久福利网| 国产成人高清激情视频在线观看| 亚洲一区二区三区久久| 久久天天躁夜夜躁狠狠躁2022| 亚洲精品一区久久久久久| 欧美成年人网站| 国产日韩欧美在线观看| 狠狠操狠狠色综合网| 国产www精品| 久久99热精品| 欧美国产日韩一区二区在线观看| 久久精品中文字幕免费mv| 国产成人精品国内自产拍免费看| 国产精品国产三级国产aⅴ浪潮| 成人综合国产精品| 日韩国产高清污视频在线观看| 国产精品一区二区性色av| 91精品久久久久久综合乱菊| 91精品国产色综合久久不卡98| 日韩在线观看视频免费| 国产成人福利网站| 国产精品久久久久久久av电影| 国产精品日韩专区| 成人网在线免费看| 亚洲免费小视频| 97视频在线观看免费高清完整版在线观看| 亚洲精品国产拍免费91在线| 亚洲人成绝费网站色www|