二維碼iOS開發-二維碼掃描和應用跳轉

iOS開發-二維碼掃描和應用跳轉

序言

前面我們已經調到過怎麼製作二維碼(點我),在我們能夠生成二維碼之後,如何對二維碼進行掃描呢?

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

ps:本期的源代碼會在文章結尾給出鏈接

掃描相關類

  • 二維碼掃描需要獲取攝像頭並讀取照片信息,因此我們需要導入系統的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。
  • 1
  • 2
  • Identifier用來跳轉後,讓跳轉應用識別從哪裏跳轉過來的,我們可以設置爲bundleID反轉,來確保其特殊性。

  • URL Schemes是一個數組,我們將在這個數組裏面自定義自己的url schemes,這裏我們填寫應用名。

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

二維碼掃描

  • 二維碼掃描的步驟:

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

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

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

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

  • 會話對象AVCaptureSession的創建

  _session = [AVCaptureSession new];
  [_session setSessionPreset: AVCaptureSessionPresetHigh];    //高質量採集
  [self setupIODevice];
  • 1
  • 2
  • 3
  • setupIODevice方法中懶加載方式創建輸入對象和輸出對象,注意必須在輸出數據對象加入到當前會話後才能設置識別的數據格式。這裏設置爲掃描二維碼以及條形碼
  [_session addInput: self.input];
  [_session addOutput: self.output];
  _output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
  • 1
  • 2
  • 3
  • 創建AVCaptureMetadataOutput設置好掃描成功回調代理以及回調線程
  _output = [AVCaptureMetadataOutput new];
  [_output setMetadataObjectsDelegate: self queue: dispatch_get_main_queue()];
  • 1
  • 2
  • 創建AVCaptureDeviceInput輸入設備爲手機攝像頭
  AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];
  _input = [AVCaptureDeviceInput deviceInputWithDevice: device error: nil];
  • 1
  • 2
  • 創建AVCaptureVideoPreviewLayer對象來實時獲取攝像頭圖像,我們需要調用[self.view addSubview: self.scanView]把攝像頭獲取的圖像實時展示在屏幕上
  _scanView = [AVCaptureVideoPreviewLayer layerWithSession: self.session];
  _scanView.videoGravity = AVLayerVideoGravityResizeAspectFill;
  _scanView.frame = self.bounds;
  • 1
  • 2
  • 3
  • 實現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 }];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

掃描優化

應用傳值

PS查看原文請點擊下面提示

本文demo:二維碼掃描集成

本文轉自:點我坐飛機

拓展Demo:

簡單二維碼集成,代碼量僅需不到十行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章