Xamarin.iOS의 핵심 NFC

iOS 11을 사용하여 NFC(근거리 통신) 태그 읽기

CoreNFC는 앱 내에서 태그를 읽을 수 있도록 NFC(근거리 통신 ) 라디오에 대한 액세스를 제공하는 iOS 11의 새로운 프레임워크입니다. CoreNFC는 i전화 7, i전화 7 Plus, i전화 8, i전화 8 Plus, i전화 X, i전화 XS 및 i전화 11 모델에서 작동합니다(i전화 6 및 i전화 6 Plus 모델에는 NFC 결제 기능이 있지만 CoreNFC를 지원하지 않음).

iOS 디바이스의 NFC 태그 판독기는 NFC NDEF(데이터 교환 형식) 정보를 포함하는 모든 NFC 태그 유형 1~5를 지원합니다.

주의해야 할 몇 가지 제한 사항은 다음과 같습니다.

  • CoreNFC는 태그 읽기만 지원합니다(쓰기 또는 서식 지정이 아님).
  • 태그 검사는 사용자가 시작하고 60초 후에 제한 시간이 초과되어야 합니다.
  • 검색을 위해 앱이 포그라운드에 표시되어야 합니다.
  • CoreNFC는 시뮬레이터가 아닌 실제 디바이스에서만 테스트할 수 있습니다.

이 페이지에서는 CoreNFC를 사용하는 데 필요한 구성을 설명하고 "NFCTagReader" 샘플 코드를 사용하여 API를 사용하는 방법을 보여 줍니다.

구성

CoreNFC를 사용하도록 설정하려면 프로젝트에서 다음 세 가지 항목을 구성해야 합니다.

  • Info.plist 개인 정보 키입니다.
  • Entitlements.plist 항목입니다.
  • NFC 태그 읽기 기능이 있는 프로비저닝 프로필입니다.

Info.plist

스캔이 발생하는 동안 사용자에게 표시되는 NFCReaderUsageDescription 개인 정보 키 및 텍스트를 추가합니다. 애플리케이션에 적합한 메시지 사용(예: 검사 목적 설명)

<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>

Entitlements.plist

앱은 Entitlements.plist에서 다음 키/값 쌍을 사용하여 근거리 통신 태그 읽기 기능을 요청해야 합니다.

<key>com.apple.developer.nfc.readersession.formats</key>
<array>
  <string>NDEF</string>
</array>

프로비전 프로필

앱 ID를 만들고 NFC 태그 읽기 서비스가 선택되어 있는지 확인합니다.

Developer Portal New App ID page with NFC Tag Reading selected

그런 다음, 이 앱 ID에 대한 새 프로비저닝 프로필을 만든 다음, 개발 Mac에 다운로드하여 설치해야 합니다.

태그 읽기

프로젝트가 구성되면 파일 맨 위에 추가하고 using CoreNFC; 다음 세 단계에 따라 NFC 태그 읽기 기능을 구현합니다.

1. 구현 INFCNdefReaderSessionDelegate

인터페이스에는 구현할 두 가지 메서드가 있습니다.

  • DidDetect – 태그를 성공적으로 읽을 때 호출됩니다.
  • DidInvalidate – 오류가 발생하거나 60초 시간 제한에 도달할 때 호출됩니다.

DidDetect

샘플 코드에서 검색된 각 메시지가 테이블 뷰에 추가됩니다.

public void DidDetect(NFCNdefReaderSession session, NFCNdefMessage[] messages)
{
    foreach (NFCNdefMessage msg in messages)
    {  // adds the messages to a list view
        DetectedMessages.Add(msg);
    }
    DispatchQueue.MainQueue.DispatchAsync(() =>
    {
        this.TableView.ReloadData();
    });
}

세션에서 여러 태그 읽기를 허용하는 경우 이 메서드를 여러 번 호출할 수 있으며 메시지 배열이 전달될 수 있습니다. 이 설정은 메서드의 세 번째 매개 변수를 Start 사용하여 설정됩니다(2단계에서 설명).

DidInvalidate

다음과 같은 여러 가지 이유로 무효화가 발생할 수 있습니다.

  • 검색하는 동안 오류가 발생했습니다.
  • 앱이 포그라운드에 있는 것을 중단했습니다.
  • 사용자가 검사를 취소하도록 선택했습니다.
  • 앱에서 검사를 취소했습니다.

아래 코드는 오류를 처리하는 방법을 보여줍니다.

public void DidInvalidate(NFCNdefReaderSession session, NSError error)
{
    var readerError = (NFCReaderError)(long)error.Code;
    if (readerError != NFCReaderError.ReaderSessionInvalidationErrorFirstNDEFTagRead &&
        readerError != NFCReaderError.ReaderSessionInvalidationErrorUserCanceled)
    {
      // some error handling
    }
}

세션이 무효화되면 다시 검색하려면 새 세션 개체를 만들어야 합니다.

2. 시작 NFCNdefReaderSession

스캔은 단추 누름과 같은 사용자 요청으로 시작해야 합니다. 다음 코드는 검사 세션을 만들고 시작합니다.

Session = new NFCNdefReaderSession(this, null, true);
Session?.BeginSession();

생성자에 대한 NFCNdefReaderSession 매개 변수는 다음과 같습니다.

  • delegate – 의 구현입니다 INFCNdefReaderSessionDelegate. 샘플 코드에서 대리자는 테이블 뷰 컨트롤러 this 에서 구현되므로 대리자 매개 변수로 사용됩니다.
  • queue – 콜백이 처리되는 큐입니다. 이 경우 샘플과 같이 사용자 인터페이스 컨트롤을 DispatchQueue.MainQueue 업데이트할 때 사용해야 할 수 null있습니다.
  • invalidateAfterFirstReadtrue– 첫 번째 검색이 성공한 false 후 검색이 중지되고 검색이 계속되고 검색이 취소되거나 60초 시간 제한에 도달할 때까지 여러 결과가 반환됩니다.

3. 검사 세션 취소

사용자는 사용자 인터페이스에서 시스템 제공 단추를 통해 스캔 세션을 취소할 수 있습니다.

Cancel button while scanning

앱은 메서드를 호출하여 프로그래밍 방식으로 검사를 취소할 수 있습니다.InvalidateSession

Session.InvalidateSession();

두 경우 모두 대리자의 DidInvalidate 메서드가 호출됩니다.

요약

CoreNFC를 사용하면 앱이 NFC 태그에서 데이터를 읽을 수 있습니다. 다양한 태그 형식(NDEF 형식 1~5)을 읽을 수 있지만 쓰기 또는 서식 지정은 지원하지 않습니다.