iOS掃一掃功能開發(fā)

之前很多二維碼掃描都是基于zxing做的拙泽,但是zxing用起來真的很麻煩隆豹,又一直不更新屯碴。隨著iOS6退出歷史舞臺践叠,終于可以使用iOS7以后言缤,用系統(tǒng)的AVFoundation做的二維碼掃描器了。

初始化相機禁灼,掃描器

- (void)setupCamera
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 耗時的操作
        // Device
        _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        
        // Input
        _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
        
        // Output
        _output = [[AVCaptureMetadataOutput alloc]init];
        //    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        
        // Session
        _session = [[AVCaptureSession alloc]init];
        [_session setSessionPreset:AVCaptureSessionPresetHigh];
        if ([_session canAddInput:self.input])
        {
            [_session addInput:self.input];
        }
        
        if ([_session canAddOutput:self.output])
        {
            [_session addOutput:self.output];
        }
        
        // 條碼類型 AVMetadataObjectTypeQRCode
        _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];
        dispatch_async(dispatch_get_main_queue(), ^{
            // 更新界面
            // Preview
            _preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
            _preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
            //    _preview.frame =CGRectMake(20,110,280,280);
            _preview.frame = self.view.bounds;
            [self.view.layer insertSublayer:self.preview atIndex:0];
            // Start
            [_session startRunning];
        });
    });
}

在viewWillAppear和viewWillDisappear里對session做優(yōu)化管挟。

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (_session && ![_session isRunning]) {
        [_session startRunning];
    }
    timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(animation1) userInfo:nil repeats:YES];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [timer invalidate];
}

以上timer是個掃描動畫的計時器,可以略過不看弄捕。

處理掃描的結(jié)果

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    
    NSString *stringValue;
    
    if ([metadataObjects count] >0)
    {
        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
        stringValue = metadataObject.stringValue;
    }
    
    [_session stopRunning];
    [timer invalidate];
    NSLog(@"%@",stringValue);
    
}

用二維碼掃描器掃自己的二維碼

NSString *url = [NSURL URLWithString:@"html/judgement.html" relativeToURL:[ZXApiClient sharedClient].baseURL].absoluteString;
    
    if ([stringValue hasPrefix:url]) {
        //如果掃出來的url是自己的域名開頭的僻孝,那么做如下的處理。
    } 

用二維碼掃描器掃別人的二維碼

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:stringValue]];

直接使用openUrl系統(tǒng)自帶的瀏覽器打開url就行察藐,或者自己寫個內(nèi)置的瀏覽器打開皮璧。

用別人的掃描器掃自己的二維碼

首先將自己的二維碼定義成http://www.xxx.com/xxxxx這樣的自己域名的url。
那么第三方的二維碼掃出來后分飞,會跳向這個網(wǎng)址悴务。

其次在服務(wù)器上部署這個頁面,加入如下的代碼

<script language="javascript">
  if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {
    var loadDateTime = new Date();
    window.setTimeout(function() {
      var timeOutDateTime = new Date();
      if (timeOutDateTime - loadDateTime < 5000) {
        window.location = "要跳轉(zhuǎn)的頁面URL";
      } else {
        window.close();
      }
    },
    25);
    window.location = " test:// ";
  } else if (navigator.userAgent.match(/android/i)) {
    var state = null;
    try {
      state = window.open("apps custom url schemes ", '_blank');
    } catch(e) {}
    if (state) {
      window.close();
    } else {
      window.location = "要跳轉(zhuǎn)的頁面URL";
    }
  }
</script>

這段代碼是基于url schemes的原理譬猫,如果你的app里存在這個url schemes(例子里是test://)讯檐,那么會立刻打開這個url,如果不存在染服,就會超過25毫秒别洪,那么就指向另一個頁面,一般是下載頁柳刮。

接著挖垛,在app的url schemes里設(shè)置,比如test

Paste_Image.png

這個時候秉颗,瀏覽器發(fā)出test://的請求的時候痢毒,就能立刻打開這個app了。

最后蚕甥,如果不滿足于掃描二維碼只能打開app哪替,想對二維碼里的內(nèi)容做一些操作的話,可以:

  • 將二維碼的內(nèi)容定義成http://www.xxx.com/xxxxx?uid=xxx這樣菇怀,當(dāng)然后面的參數(shù)需要加密凭舶。
  • 在js代碼里獲取這個參數(shù),并原封不動的附加在url schemes后面爱沟,如test://uid=xxx帅霜。
  • 在appDelegate里加上如下代碼。
 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    if ([url.absoluteString hasPrefix:@"test://uid="]) {
        NSString *uid = [url.absoluteString substringFromIndex:11];
        NSLog(@"uid=%@",uid);
        //對uid進行操作
    } else {
        //其他的地方拋過來的url钥顽,比如微信
        return [WXApi handleOpenURL:url delegate:self];
    }
    return YES;
}

用別人的掃描器掃別人的二維碼

34ebbc5ccf91e9deffe7f8d1fead2675.png

最后來張效果圖

2015-04-08 09_52_30.gif

應(yīng)許多同學(xué)要求义屏,上個demo

demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜂大,隨后出現(xiàn)的幾起案子闽铐,更是在濱河造成了極大的恐慌,老刑警劉巖奶浦,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兄墅,死亡現(xiàn)場離奇詭異,居然都是意外死亡澳叉,警方通過查閱死者的電腦和手機隙咸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來成洗,“玉大人五督,你說我怎么就攤上這事∑垦辏” “怎么了充包?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遥椿。 經(jīng)常有香客問我基矮,道長,這世上最難降的妖魔是什么冠场? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任家浇,我火速辦了婚禮,結(jié)果婚禮上碴裙,老公的妹妹穿的比我還像新娘钢悲。我一直安慰自己,他們只是感情好舔株,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布莺琳。 她就那樣靜靜地躺著,像睡著了一般督笆。 火紅的嫁衣襯著肌膚如雪芦昔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天娃肿,我揣著相機與錄音咕缎,去河邊找鬼。 笑死料扰,一個胖子當(dāng)著我的面吹牛凭豪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晒杈,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫂伞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帖努,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤撰豺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拼余,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體污桦,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年匙监,在試婚紗的時候發(fā)現(xiàn)自己被綠了凡橱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亭姥,死狀恐怖稼钩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情达罗,我是刑警寧澤坝撑,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站氮块,受9級特大地震影響绍载,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滔蝉,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一击儡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝠引,春花似錦阳谍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吊洼,卻和暖如春训貌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冒窍。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工递沪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人综液。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓款慨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谬莹。 傳聞我的和親對象是個殘疾皇子檩奠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容