[ios] Core NFC를 이용한 전자 티켓 시스템

iOS 11부터 Apple은 Core NFC 프레임워크를 도입하여 iPhone에서 NFC(Near Field Communication) 태그를 스캔할 수 있게 되었습니다. 이것은 전자 티켓, 신원 확인, 그리고 기타 다양한 NFC 기반 애플리케이션을 개발하는 데 사용될 수 있습니다.

이번 포스트에서는 Core NFC를 활용하여 간단한 전자 티켓 시스템을 구현하는 방법을 살펴보겠습니다.

Core NFC란 무엇인가요?

Core NFC는 iOS에서 NFC 태그를 스캔하고 정보를 읽는 데 사용되는 프레임워크입니다. NFC 태그는 일반적으로 전자 티켓, 신원 확인 및 기타 정보를 저장합니다. Core NFC를 사용하면 앱에서 이러한 태그를 스캔하여 정보를 읽을 수 있습니다.

전자 티켓 시스템 구현하기

1. 프로젝트 설정

우선 Xcode에서 새로운 iOS 앱 프로젝트를 생성합니다. 그리고 프로젝트 설정에서 NFC가 활성화되어 있는지 확인합니다.

2. Core NFC 추가하기

앱의 Info.plist 파일에 NFC 사용 권한을 추가해야 합니다. Privacy - NFC Scan Usage Description 항목을 추가하고 사용자에게 NFC를 스캔하기 위한 이유를 설명하는 메시지를 작성합니다.

<key>NSNFCUsageDescription</key>
<string>이 앱은 NFC 태그를 스캔하여 정보를 읽습니다.</string>

3. NFC 태그 스캔하기

NFC 태그를 스캔하기 위해 NFC Reader Session을 설정해야 합니다. CoreNFC를 import하고 NFCTagReaderSessionDelegate 프로토콜을 준수하는 클래스를 구현합니다. 태그가 스캔될 때 호출되는 콜백 함수를 정의하고 NFC Reader Session을 시작합니다.

import CoreNFC

class ViewController: UIViewController, NFCTagReaderSessionDelegate {

    var nfcSession: NFCTagReaderSession?

    func startNFCSession() {
        nfcSession = NFCTagReaderSession(pollingOption: .iso14443, delegate: self)
        nfcSession?.begin()
    }

    func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
        // 태그 스캔 시 처리 로직 작성
    }
  
    // 기타 필요한 메소드 구현
}

4. NFC 태그 정보 읽기

NFC 태그가 스캔되면, tagReaderSession(_:didDetect:) 메소드가 호출됩니다. 이 메소드에서 태그에서 정보를 읽고 처리하는 로직을 작성합니다.

func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
    guard let tag = tags.first else { return }
    session.connect(to: tag) { (error: Error?) in
        if error != nil {
            session.invalidate(errorMessage: "연결에 실패했습니다.")
            return
        }
      
        // NFC 태그 정보 읽기
        if case let .iso7816(iso7816Tag) = tag {
            let apdu = NFCISO7816APDU(instructionClass: 0, instructionCode: 0xB0, p1Parameter: 0, p2Parameter: 0, data: Data(), expectedResponseLength: 16)
            iso7816Tag.sendCommand(apdu) { (data: Data, sw1: UInt8, sw2: UInt8, error: Error?) in
                if error != nil {
                    print("읽기 실패: \(error!)")
                    return
                }
                // 읽은 데이터 처리
            }
        }
      
        session.invalidate(errorMessage: "처리 완료")
    }
}

위의 코드는 NFC 태그를 스캔하고 ISO 7816 포맷으로 저장된 데이터를 읽는 예시입니다.

마치며

Core NFC를 이용하여 전자 티켓 시스템을 구현하는 방법에 대해 간단히 살펴보았습니다. NFC를 활용한 다양한 애플리케이션을 개발할 수 있는 가능성에 대해 열려 있는 환경을 확인했습니다. Core NFC를 활용하여 다양한 산업 분야에서 혁신적인 서비스를 제공할 수 있을 것으로 기대됩니다.

더 많은 자세한 내용은 Apple의 Core NFC 개발 가이드를 참고하시기 바랍니다.