iOS關(guān)于ZXing掃碼在控制器dissmiss導(dǎo)致崩潰的問題

最近因?yàn)轫?xiàng)目中有掃碼登錄的需求先馆,一開始用的是系統(tǒng)的AVFoundation庫實(shí)現(xiàn)的掃碼功能

@property (nonatomic,strong) AVCaptureSession *captureSession;//捕捉會話

@property (nonatomic,strong) AVCaptureDeviceInput *deviceInput;//輸入流

@property (nonatomic,strong) AVCaptureMetadataOutput *metaDataOutput;//輸出流

@property (nonatomic,strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;//預(yù)覽圖層
//開始掃描
- (void)startCapture{
    if (![self requestDeviceAuthorization]) {
        [[UUCommon shareInstance] uu_alertWithTitle:@"沒有相機(jī)訪問權(quán)限" message:@"請?jiān)谠O(shè)置->通用->相機(jī)中允許訪問" centerStr:@"去設(shè)置" centerItem:^{
            NSURL *url = [[NSURL alloc] initWithString:UIApplicationOpenSettingsURLString];// 跳轉(zhuǎn)至系統(tǒng)設(shè)置
            [[UIApplication sharedApplication] openURL:url];
        }];
        return;
    }
    
    [self.captureSession beginConfiguration];
    if ([self.captureSession canAddInput:self.deviceInput]) {
        [self.captureSession addInput:self.deviceInput];
    }
    // 設(shè)置數(shù)據(jù)輸出類型温亲,需要將數(shù)據(jù)輸出添加到會話后,才能指定元數(shù)據(jù)類型端考,否則會報(bào)錯(cuò)
    if ([self.captureSession canAddOutput:self.metaDataOutput]) {
        [self.captureSession addOutput:self.metaDataOutput];
        //設(shè)置掃碼支持的編碼格式(如下設(shè)置條形碼和二維碼兼容)
        NSArray *types = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode93Code];
        self.metaDataOutput.metadataObjectTypes =types;
    }
    [self.captureSession commitConfiguration];
    [self.captureSession startRunning];
}

//停止掃描
- (void)stopCapture{
    [self.captureSession stopRunning];
    [self.shadowView uu_scanStop];
}

#pragma mark - 請求權(quán)限
- (BOOL)requestDeviceAuthorization{
    
    AVAuthorizationStatus deviceStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    if (deviceStatus == AVAuthorizationStatusRestricted ||
        deviceStatus ==AVAuthorizationStatusDenied){
        return NO;
    }
    return YES;
}
#pragma mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    //獲取到掃描的數(shù)據(jù)
    AVMetadataMachineReadableCodeObject *dateObject = (AVMetadataMachineReadableCodeObject *) [metadataObjects lastObject];
    [self.captureSession stopRunning];
    NSLog("%@", dateObject.stringValue);
}

后來參考一下第三方的ZXing庫紫新,可以解決系統(tǒng)掃碼識別亂碼問題,主要是和安卓端保持一致担平,就開始修改成ZXing的掃碼:

//導(dǎo)入頭文件
#import <ZXingObjC/ZXingObjC.h>
//遵循代理<ZXCaptureDelegate>
//ZXCapture捕獲器
@property (nonatomic, strong) ZXCapture *capture;             //ZXCapture捕獲器
//加載ZXCapture捕獲器
- (void)setupCapture {
self.capture = [[ZXCapture alloc] init];
    self.capture.camera = self.capture.back;
    //自動聚焦
    self.capture.focusMode = AVCaptureFocusModeContinuousAutoFocus;
    [self.view.layer addSublayer:self.capture.layer];
    self.capture.delegate = self;
}
//開始掃描
- (void)startCapture {
    if (![self requestDeviceAuthorization]) {
        [self alertWithTitle:@"沒有相機(jī)權(quán)限" message:@"請?jiān)谠O(shè)置-通用-相機(jī)-允許訪問" leftStr:@"去設(shè)置" rightStr:@"取消" leftItem:^{
            NSURL *openURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
            [[UIApplication sharedApplication] openURL:openURL];
        } rightItem:^{
            
        }];
        
        return;
    }
    
    //TODO:ZXing捕獲器
    [self.capture start];
}

//停止掃描
- (void)stopCapture {
    //TODO:ZXing停止掃碼
    [self.capture stop];
}
#pragma mark - ZXCaptureDelegate
- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result {
    if (!result) return;
    
    if (self.capture.layer.superlayer) {
        if (result.barcodeFormat == kBarcodeFormatQRCode) {
            AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
            
            [self stopCapture];
            
            NSLog(@"識別的二維碼的內(nèi)容 = %@", result.text);
        }
    }
}

這就完了示绊?等等,掃碼的功能是實(shí)現(xiàn)了暂论,本例中用到的是模態(tài)出的掃描二維碼頁面面褐,dismiss的時(shí)候在iOS13的機(jī)型上會閃退。通過百度大法后才知道ZXing庫需要在控制器dismiss的前移除layer取胎,不然會導(dǎo)致崩潰展哭。

修復(fù)的代碼:
self.capture.delegate = nil;
[self.capture.layer removeFromSuperlayer];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市闻蛀,隨后出現(xiàn)的幾起案子匪傍,更是在濱河造成了極大的恐慌,老刑警劉巖循榆,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件析恢,死亡現(xiàn)場離奇詭異,居然都是意外死亡秧饮,警方通過查閱死者的電腦和手機(jī)映挂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盗尸,“玉大人柑船,你說我怎么就攤上這事∑酶鳎” “怎么了鞍时?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扣蜻。 經(jīng)常有香客問我逆巍,道長,這世上最難降的妖魔是什么莽使? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任锐极,我火速辦了婚禮,結(jié)果婚禮上芳肌,老公的妹妹穿的比我還像新娘灵再。我一直安慰自己肋层,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布翎迁。 她就那樣靜靜地躺著栋猖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汪榔。 梳的紋絲不亂的頭發(fā)上蒲拉,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音揍异,去河邊找鬼全陨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛衷掷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柿菩,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼戚嗅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枢舶?” 一聲冷哼從身側(cè)響起懦胞,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凉泄,沒想到半個(gè)月后躏尉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡后众,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年胀糜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒂誉。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡教藻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出右锨,到底是詐尸還是另有隱情括堤,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布绍移,位于F島的核電站悄窃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹂窖。R本人自食惡果不足惜轧抗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恼策。 院中可真熱鬧鸦致,春花似錦潮剪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绽乔,卻和暖如春弧蝇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背折砸。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工看疗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睦授。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓两芳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親去枷。 傳聞我的和親對象是個(gè)殘疾皇子怖辆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359