낙농일기
QRCode detecting in iOS11 - Swift3, Swift4
江多林
2017. 11. 1. 11:00
유행의 흐름이 조금은 지나버린 QRCode, 과 관련된 것을 개발중에 있다.
QRCode 는 2차원 바코드 중에서 라이선스 비용이 들지 않고,
최대 4KB 의 데이터를 넣을 있는 대용량 2차원 바코드로 알려져 있다.
이번에 리서치한 결과로는 다른 barcode 계열도 문자(알파벳)를 포함할 수 있기도하고,
2차원 barcode 를 중첩하고, 연결해서 무한 확장이 가능한 것도 있었다.
하지만, QRCode 의 독톡한 문양에서 주는 독창성과
글자 기준으로 충분한 용량
무엇보다다도 iOS11 의 기본 사진앱의 '정사각형' 카메라 모드에서
QR에 첨부된 URL을 바로 열어주는 기능이 포함되어서
아이폰의 경우 그 매력이 많이 올라갔다고 생각된다.
그리고, iOS7 부터는 SDK만으로 외부라이브러리 도움없이 생성과 읽기가 가능해졌다.
그리고, iOS11에서는 그 API가 더욱 정교해졌다.
우리농장의 QRCode 관련 기능을 iOS SDK 기반으로 새로 작성하고,
기존에 외부라이브러리(ZBar, ZXing) 구성을 제거하는 작업을 진행중에 있다.
QRCode 개발중에 참조한 샘플예제는 맨 아래 링크를 참조.
스스로 이해한 방식으로 재구성한 샘플을 현재 작업중인 프로젝트에 적용하려고 보니
swift버전이 서로 달라 문제가 되었다. (샘플: swift4, 프로젝트: swift3)
swift3 로 포팅하기로 결정하고, 작업하던 중에 심각한 난관에 부딪혔다.
잘 동작하던 QRReader가 swift3 를 위해 작업한 쪽에서는 동작하지 않는 것이다.
무언가 설정 문제로 판단하고,
설정하는 코드를 주의 깊게 살펴보고,
한줄한줄 디버깅해보았지만,
문제가 파악되지 않는다.
- 에러는 커녕 사소한 경고도 발생하지 않았다. -
마지막으로 문제될 부분은 인식결과 delegate(이벤트)가 발생하지 않는 것이었다.
SDK버그로 추정하는 것은 개발자에게 금기이지만,
동일 iOS버전에서 swift3냐 swift4 에 따라 동작여부가 결정된다면,
아버지씨(objc)는 상관없이 동작할 것으로 판단했고,
그래서, objc 의 delegate method 의 형태로 델리게이트를 구성했다.
이제 워닝이 발생하기 시작한다.
delegate protocol에 선언된 것과 현재 구현된 정의와 다르다는 경고,
이리 저리 해보다 이제 메소드명으로 구글을 검색.. 스택오버플로에서 몇 개의 포스트를 찾았다.
https://stackoverflow.com/questions/39437992/code-for-capturing-qr-code-doesnt-seem-working-well-in-xcode8-and-swift3/39438273#39438273
ObjC delegate protocol 정의에는 NSArray<__kindof AVMetaObject *> 형식을 사용하지만,
swift3 에서는 [Any]! 를 사용해야한다.
이걸로 보아서 어쩌면, swift3 가 참조하는 라이브러리는
ObjC 쪽도 Swift4 도 아닌 제 3의 뭔가를 참조하는지도 모르겠다..
애플..
ObjC 와 Swift간의 delegate method name 이 서로 다를 수 있다.
iOS버전이 올라가면서 delegate method name이 바뀔 수 있다.
그런데, iOS/ Xcode 버전이 동일한 상태에서 swift3와 swift4 간의 메소드명이 다르다니.
심지어 warning은 커녕 문서화도 안되어 있다니...
화난다.
참조 Reader Sample
AVCamBarcode: Using AVFoundation to Detect Barcodes and Faces
https://developer.apple.com/library/content/samplecode/AVCamBarcode
참조 Generator Sample
https://www.appcoda.com/qr-code-generator-tutorial/