투케이2K

627. (ios/swift5) NFCNDEFReaderSession begin 사용해 NFC 스캔 준비 및 활성 수행 실시 본문

IOS

627. (ios/swift5) NFCNDEFReaderSession begin 사용해 NFC 스캔 준비 및 활성 수행 실시

투케이2K 2025. 1. 19. 15:37

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 
 

[소스 코드]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Swift5

- 개발 툴 : Xcode

- 기술 구분 : 유틸 파일 / NFC / Support

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

// -----------------------------------------------------------------------------------------
// MARK: - [SEARCH FAST] : startNfcScan : NFC 스캔 동작 수행
// -----------------------------------------------------------------------------------------
// TODO [호출 방법 소스 코드]
// -----------------------------------------------------------------------------------------
/*
  
  DispatchQueue.main.async { // [비동기 요청]
      
      C_Nfc_Card_Module().startNfcScan(type: 0){(result) in
          
          S_Log._D_(description: "NFC 스캔 결과 확인", data: ["\(result)"])
          
      }
      
  }
  
*/
// -----------------------------------------------------------------------------------------
/*
  *
  * -----------------------------------------------------------------------------------------
  * TODO [설명] : NFC TAG , NDEF 메시지 스캔 메소드
  *
  * 1) 사전) Xcode 에서 NFC 기능 사용 설정 필요 : https://blog.naver.com/kkh0977/223729651712
  * 2) 사전) NFCNDEFReaderSessionDelegate 클래스 상속 필요
  * -----------------------------------------------------------------------------------------
  * TODO [Input] : 인풋 파라미터
  *
  * @param type : NFC 스캔 동작 타입 (0 == TAG / 1 == NDEF 메시지)
  * -----------------------------------------------------------------------------------------
  * TODO [Return] : 리턴 데이터
  *
  * @return : NFC 스캔 데이터
  * -----------------------------------------------------------------------------------------
  * TODO [History] : 이력 정리 [create , update , delete]
  *
  * 1) KwonGiHwan : create : 2025-01-19 : 최초 생성 수행
  * -----------------------------------------------------------------------------------------
  *
  * */

public static var nfcSession: NFCNDEFReaderSession? = nil // [NFC 스캔 객체]
var nfcScanResult = false // [NFC 스캔 데이터]
var scan_log = "" // [스캔 동작 로직 로그]
public static var NFC_SCAN_TYPE = -1 // [NFC 스캔 타입]
private let nfcScanOperationQueue = OperationQueue() // [작업 큐]

func startNfcScan(type: Int, callback: @escaping (Bool) -> ()) {
    S_Log._D_(description: "NFC 스캔 수행 실시", data: nil)
    
    
    // [변수 값 초기화]
    C_Nfc_Card_Module.nfcSession = nil
    self.nfcScanResult = false
    C_Nfc_Card_Module.NFC_SCAN_TYPE = -1
    self.scan_log = ""
    
    
    // [작업 큐에 추가]
    self.nfcScanOperationQueue.isSuspended = true
    let block = { callback(self.nfcScanResult) }
    self.nfcScanOperationQueue.addOperation(block)
    
    
    DispatchQueue.main.async {
      
        // [NFC 사용 가능 기기 상태 확인] : NFCNDEFReaderSession.readingAvailable
        C_StateCheck().getNfcState(){(result) in
            S_Log._D_(description: "NFC 권한 부여 및 사용 가능 상태 확인", data: ["\(result)"])
            
            if result == true {
                
                // [스캔 타입 전역 변수 삽입]
                C_Nfc_Card_Module.NFC_SCAN_TYPE = type
                
                
                // [방어 로직 : 스캔 타입 값 확인]
                if C_Nfc_Card_Module.NFC_SCAN_TYPE == 0 || C_Nfc_Card_Module.NFC_SCAN_TYPE == 1 {
                    
                    // ---------------------------------------------
                    // MARK: [NFC 세션 초기화 및 스캔 동작 수행]
                    // ---------------------------------------------
                    C_Nfc_Card_Module.nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
                    C_Nfc_Card_Module.nfcSession?.alertMessage = "NFC 태그에 기기를 가까이 대주세요."
                    C_Nfc_Card_Module.nfcSession?.begin()
                    // ---------------------------------------------
                    
                    
                    // ---------------------------------------------
                    // MARK: [작업 성공 처리]
                    // ---------------------------------------------
                    // NFCNDEFReaderSessionDelegate : 딜레게이트에서 실시간 스캔 데이터 확인
                    // ---------------------------------------------
                    // NFCNDEFTag / NFCNDEFMessage
                    // ---------------------------------------------
                    self.scan_log = "[Success] :: Nfc Scan Start"
                    S_Log._W_(description: "NFC 스캔 동작 성공", data: ["\(self.scan_log)"])
                    
                    self.nfcScanResult = true
                    self.nfcScanOperationQueue.isSuspended = false
                    // ---------------------------------------------
                    
                }
                else {
                    
                    // [작업 종료 처리]
                    self.scan_log = "[Error] :: C_StateCheck getNfcState False"
                    S_Log._E_(description: "NFC 스캔 동작 에러", data: ["\(self.scan_log)"])
                    
                    self.nfcScanOperationQueue.isSuspended = false
                    
                }
            }
            
        }
        
    }
 

[결과 출력]


반응형
Comments