app 개발에 대한 감을 놓치고 싶지 않아서 이것저것 샘플 코드 살펴보면서 감을 유지해야겠다
언젠가는 쓸모가 있을 것이다
우선 NFC Reader를 구현하기 위해서는 Core NFC 프레임워크를 사용해야 한다.
Core NFC 프레임워크를 사용하기 위해서는 Info.plist 파일에 NFC 능력을 요청하는 Key를 추가해야 한다.
Key는 NFCReaderUsageDescription
<key>NFCReaderUsageDescription</key>
<string>This app requires access to NFC capabilities to read and write NFC tags.</string>
SwiftUI를 사용하여 NFC Reader 구현
import SwiftUI
import CoreNFC
struct ContentView: View {
@State private var tagValue = "No tag detected"
var body: some View {
VStack {
Text(tagValue)
.padding()
Button("Start Reading") {
self.startNFCReaderSession()
}
}
}
func startNFCReaderSession() {
guard NFCReaderSession.readingAvailable else {
print("NFC reading not available on this device")
return
}
let nfcSession = NFCReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
nfcSession.begin()
}
}
extension ContentView: NFCReaderSessionDelegate {
func readerSession(_ session: NFCReaderSession, didDetect tags: [NFCTag]) {
guard let tag = tags.first else { return }
session.connect(to: tag) { error in
if let error = error {
session.invalidate(errorMessage: "Connection error: \(error.localizedDescription)")
return
}
if case let NFCTag.miFare(tag) = tag {
let data = tag.identifier
self.tagValue = data.reduce("", {$0 + String(format: "%02X", $1)})
session.alertMessage = "Tag read successfully"
session.invalidate()
} else {
session.invalidate(errorMessage: "Tag not recognized")
}
}
}
func readerSession(_ session: NFCReaderSession, didInvalidateWithError error: Error) {
print("Session invalidated: \(error.localizedDescription)")
}
}
ContentView에서 NFCReaderSessionDelegate 프로토콜을 채택한다.
startNFCReaderSession() 메서드에서 NFCReaderSession을 생성하고, begin() 메서드를 호출하여 NFC 리더기 세션을 시작한다.' NFC 리더기 세션이 시작되면, didDetect(tags:) 메서드가 호출됩니다. 이 메서드에서 태그를 인식하고, 데이터를 읽어온다.
태그에서 읽어온 데이터는 tagValue 변수에 할당되고, UI가 업데이트된다
NFC Writer를 사용하기 위해서는 NFC NDEF 프레임워크를 사용해야 한다.
NFC NDEF 프레임워크는 NFC 태그와 NFC 태그에 저장된 데이터를 처리하는 데 사용된다
NFC Writer를 구현
import SwiftUI
import CoreNFC
struct ContentView: View {
@State private var tagValue = "No tag detected"
@State private var nfcText = ""
var body: some View {
VStack {
Text(tagValue)
.padding()
TextField("Enter text to write on tag", text: $nfcText)
.padding()
Button("Start Writing") {
self.startNFCWriterSession()
}
}
}
func startNFCWriterSession() {
guard NFCNDEFReaderSession.readingAvailable else {
print("NFC writing not available on this device")
return
}
let nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
nfcSession.begin()
}
}
extension ContentView: NFCNDEFReaderSessionDelegate {
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
guard let tag = tags.first else { return }
session.connect(to: tag) { error in
if let error = error {
session.invalidate(errorMessage: "Connection error: \(error.localizedDescription)")
return
}
let ndefMessage = NFCNDEFMessage(records: [NFCNDEFPayload.wellKnownTypeTextPayload(string: self.nfcText, locale: .current)])
tag.writeNDEF(ndefMessage) { error in
if let error = error {
session.invalidate(errorMessage: "Write error: \(error.localizedDescription)")
return
}
self.tagValue = "Tag written successfully"
session.alertMessage = "Tag written successfully"
session.invalidate()
}
}
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print("Session invalidated: \(error.localizedDescription)")
}
}
ContentView에서 NFCNDEFReaderSessionDelegate 프로토콜을 채택한다.
startNFCWriterSession() 메서드에서 NFCNDEFReaderSession을 생성하고, begin() 메서드를 호출하여 NFC 쓰기 세션을 시작한다.
NFC 쓰기 세션이 시작되면, didDetect(tags:) 메서드가 호출된다.
이 메서드에서 NFC 태그를 연결하고, NFC 태그에 쓸 데이터를 작성한다.
데이터를 작성한 후에는 writeNDEF() 메서드를 호출하여 NFC 태그에 데이터를 쓸 수 있다.
데이터가 성공적으로 쓰여지면, UI가 업데이트되고, NFC 쓰기 세션이 종료된다
위 코드에서는 TextField를 통해 사용자가 NFC 태그에 쓸 데이터를 입력할 수 있도록 하고있다.
사용자가 입력한 데이터는 nfcText 변수에 저장되고, NFCNDEFPayload.wellKnownTypeTextPayload() 메서드를 사용하여 NFC 태그에 쓸 payload 데이터를 만든다.
이 payload 데이터는 NFCNDEFMessage() 객체의 records 배열에 저장되어 NFC 태그에 쓰여지게 된다.
NFCNDEFPayload.wellKnownTypeTextPayload() 메서드는 텍스트 payload 데이터를 생성한다.
이 payload 데이터는 지정된 텍스트 문자열과 Locale 정보를 포함한다.
예를 들어, "Hello, World!" 라는 텍스트를 NFC 태그에 쓰기 위해서는 아래와 같이 wellKnownTypeTextPayload() 메서드를 사용한다
locale 매개 변수는 locale을 나타내며, 현재 locale이 기본값
let payload = NFCNDEFPayload.wellKnownTypeTextPayload(string: "Hello, World!", locale: .current)
let message = NFCNDEFMessage(records: [payload])
'iOS' 카테고리의 다른 글
[error] Unable to install "AppName" Code: -402653081 (0) | 2021.01.19 |
---|