[ios] Core NFC를 활용한 스마트폰 지갑 애플리케이션

스마트폰 지갑 애플리케이션은 NFC 기술을 사용하여 결제 및 티켓 관리 등을 가능케 하는 중요한 기능이다. 이번 포스트에서는 iOS 개발 환경에서 Core NFC 기능을 활용하여 스마트폰 지갑 애플리케이션을 개발하는 방법에 대해 알아보겠습니다.

Core NFC란?

Core NFC는 iOS 11부터 도입된 프레임워크로, Near Field Communication (NFC) 기능을 활용하여 NFC 태그와의 상호작용을 가능하게 합니다. 이를 통해 iPhone 및 iPad 애플리케이션에서 NFC 태그를 탐지하고 정보를 읽거나 쓸 수 있습니다.

스마트폰 지갑 애플리케이션 개발하기

1. Core NFC 허용 및 Info.plist 설정

먼저 애플리케이션에 NFC 기능을 활성화하기 위해 Xcode 프로젝트의 Capabilities에서 Near Field Communication Tag Reading을 활성화하고, Info.plist 파일에 NFC 사용에 관한 설명을 추가해야 합니다.

<key>NFCReaderUsageDescription</key>
<string>앱에서 NFC를 사용하여 NFC 태그를 읽거나 쓸 수 있습니다.</string>

2. NFC 태그 리더 세션 시작

NFC 태그와의 상호작용을 위해 NFCTagReaderSession을 생성하고 시작해야 합니다. 다음은 NFC 태그 리더 세션을 시작하는 예제 코드입니다.

import CoreNFC

class NFCReaderViewController: UIViewController, NFCTagReaderSessionDelegate {
    var nfcSession: NFCTagReaderSession?

    func startNFCReading() {
        nfcSession = NFCTagReaderSession(pollingOption: .iso14443, delegate: self)
        nfcSession?.alertMessage = "NFC 태그를 리더기에 가까이 대세요."
        nfcSession?.begin()
    }

    func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
        // NFC 태그를 감지했을 때의 동작
    }

    func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
        // NFC 태그 리더 세션을 종료하거나 오류가 발생했을 때의 동작
    }
}

3. NFC 태그 정보 읽기

NFC 태그를 감지하면 해당 태그에서 정보를 읽거나 쓸 수 있습니다. 다음은 NFC 태그에서 데이터를 읽는 예제 코드입니다.

func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
    if case let NFCTag.iso7816(tag) = tags.first! {
        session.connect(to: tags.first!) { (error: Error?) in
            if error != nil {
                session.invalidate(errorMessage: "연결 도중 오류가 발생했습니다.")
                return
            }

            let apdu = NFCISO7816APDU(instructionClass: 0, instructionCode: 0xB0, p1Parameter: 0, p2Parameter: 0, data: Data(), expectedResponseLength: 16)

            tag.sendCommand(apdu) { (data: Data, sw1: UInt8, sw2: UInt8, error: Error?) in
                if error != nil {
                    session.invalidate(errorMessage: "데이터를 읽는 중 오류가 발생했습니다.")
                    return
                }

                // 데이터를 성공적으로 읽었을 때의 동작
            }
        }
    }
}

4. NFC 태그 쓰기

NFC 태그에 데이터를 쓰는 예제 코드도 아래와 같이 나타낼 수 있습니다.

if case let NFCTag.iso7816(tag) = tags.first! {
    session.connect(to: tags.first!) { (error: Error?) in
        if error != nil {
            session.invalidate(errorMessage: "연결 도중 오류가 발생했습니다.")
            return
        }

        let apdu = NFCISO7816APDU(instructionClass: 0, instructionCode: 0xD6, p1Parameter: 0, p2Parameter: 0, data: Data([0x03, 0x0C, 0x00, 0x00, 0x05]), expectedResponseLength: 16)

        tag.sendCommand(apdu) { (data: Data, sw1: UInt8, sw2: UInt8, error: Error?) in
            if error != nil {
                session.invalidate(errorMessage: "데이터를 쓰는 중 오류가 발생했습니다.")
                return
            }

            // 데이터를 성공적으로 썼을 때의 동작
        }
    }
}

결론

위에서 소개한 방법을 활용하여 Core NFC를 사용한 스마트폰 지갑 애플리케이션을 개발할 수 있습니다. NFC 태그 리더 세션을 시작하여 태그를 감지하고, 정보를 읽거나 쓰는 등의 동작을 수행할 수 있습니다.

Core NFC를 활용하여 스마트폰 지갑 애플리케이션을 개발하면 사용자에게 더 나은 이용 경험을 제공할 수 있을 뿐 아니라, 더 안전하고 편리한 결제 및 티켓 관리를 가능케 할 수 있습니다.

참고자료: