core-nfc은(는) 무엇을 하나요?
CoreNFC를 사용하여 NFC 태그를 읽고 씁니다. NDEF 태그 스캔, ISO7816/ISO15693/FeliCa/MIFARE 태그 읽기, NDEF 메시지 쓰기, NFC 세션 수명 주기 처리, NFC 자격 구성, iOS 앱에서 백그라운드 태그 읽기 구현 시 사용하세요.
요구 사항
- Xcode 12 이상
- iOS 13 이상 (일부 기능은 iOS 14+ 필요)
- 실제 iOS 기기 (시뮬레이터에서는 NFC를 지원하지 않음)
- Apple Developer Program 멤버십 (자격 구성 필요)
설정
1. NFC 자격 추가
Xcode 프로젝트에서 다음 단계를 따르세요:
- Signing & Capabilities 탭으로 이동
- + Capability 버튼 클릭
- Near Field Communication Tag Reading 검색 및 추가
2. Info.plist 설정
다음 키를 Info.plist에 추가하세요:
<key>NFCReaderUsageDescription</key>
<string>이 앱은 NFC 태그를 읽고 쓰기 위해 NFC 사용 권한이 필요합니다.</string>
백그라운드 태그 읽기의 경우 추가로 다음을 포함하세요:
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>D2760000850101</string>
</array>
3. CoreNFC 임포트
import CoreNFC
기본 사용법
NDEF 태그 읽기
class NFCReader: NSObject, NFCNDEFReaderSessionDelegate {
var session: NFCNDEFReaderSession?
func startReading() {
session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: false)
session?.alertMessage = "NFC 태그 주변에 iPhone을 가져가세요."
session?.begin()
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages {
for record in message.records {
let payload = String(data: record.payload, encoding: .utf8) ?? "디코딩 실패"
print("감지된 페이로드: \(payload)")
}
}
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print("세션 오류: \(error.localizedDescription)")
}
}
NDEF 태그 쓰기
func writeNDEFMessage() {
guard let session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: true) else { return }
session.alertMessage = "NFC 태그에 쓸 준비가 되었습니다."
session.begin()
}
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
if tags.count > 1 {
session.invalidate(errorMessage: "둘 이상의 태그가 감지되었습니다.")
return
}
let tag = tags.first!
session.connect(to: tag) { error in
if error != nil {
session.invalidate(errorMessage: "태그 연결 실패.")
return
}
let payload = NFCNDEFPayload(
format: .nfcWellKnown,
type: "T".data(using: .utf8)!,
identifier: Data(),
payload: "Hello, NFC!".data(using: .utf8)!
)
let message = NFCNDEFMessage(records: [payload])
tag.writeNDEF(message) { error in
if error != nil {
session.invalidate(errorMessage: "쓰기 실패.")
} else {
session.alertMessage = "성공적으로 기록되었습니다!"
session.invalidate()
}
}
}
}
ISO7816 태그 읽기
class NFCTagReader: NSObject, NFCTagReaderSessionDelegate {
var session: NFCTagReaderSession?
func startTagReading() {
session = NFCTagReaderSession(pollingOption: .iso14443, delegate: self, queue: DispatchQueue.main)
session?.alertMessage = "NFC 태그 주변에 iPhone을 가져가세요."
session?.begin()
}
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
if case let .iso7816(isoTag) = tags.first! {
session.connect(to: tags.first!) { error in
if error != nil { return }
let apdu = NFCISO7816APDU(
instructionClass: 0x00,
instructionCode: 0xA4,
p1Parameter: 0x04,
p2Parameter: 0x00,
data: Data([0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01]),
expectedResponseLength: -1
)
isoTag.sendCommand(apdu: apdu) { response, sw1, sw2, error in
print("응답: \(response as NSData), SW1: \(sw1), SW2: \(sw2)")
}
}
}
}
func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
print("세션 무효화: \(error.localizedDescription)")
}
}
백그라운드 태그 읽기
iOS 14 이상에서 지원됩니다:
- Xcode에서 Signing & Capabilities에 NFC 태그 읽기 자격을 추가하세요.
- 읽고자 하는 ISO7816 애플리케이션 식별자(AID)로
com.apple.developer.nfc.readersession.iso7816.select-identifiers를 구성하세요. - 앱이 백그라운드에 있을 때, 시스템이 일치하는 NFC 태그를 감지하고 앱을 깨웁니다.
- 앱 델리게이트에서
NFCNDEFReaderSession을 시작하여 태그 데이터를 검색하세요.
세션 수명 주기
- 시작:
begin()을 호출하여 NFC 스캐닝을 활성화합니다. - 감지:
didDetectdelegate 메서드가 태그와 함께 호출됩니다. - 연결:
connect(to:completionHandler:)를 사용하여 태그와 세션을 연결합니다. - 통신: 적절한 태그 클래스 메서드(
readNDEF,writeNDEF,sendCommand등)를 사용합니다. - 무효화: 완료 후
invalidate()를 호출하거나, 오류 시invalidate(errorMessage:)를 호출합니다.
팁과 모범 사례
- 각 NFC 스캔에 대해 명확하고 간결한 알림 메시지를 제공하세요.
- 항상
didInvalidateWithErrordelegate 메서드를 구현하여 오류를 우아하게 처리하세요. - 여러 태그가 동시에 감지되는 상황을 방지하기 위해 태그 수를 확인하세요.
- 민감한 데이터가 포함된 NDEF 페이로드는 적절히 처리하세요.
- 실제 기기에서 테스트하세요 — 시뮬레이터는 NFC를 지원하지 않습니다.
- Apple의 CoreNFC 문서에서 추가 세부 정보를 확인하세요.