web-dev-qa-db-ja.com

iOS 11 Core NFC-サンプルコード?

最初のiOS 11ベータ版をiPhone 7にインストールしたばかりで、NFCを試すことに興味があります。設定には何もありません。タグの読み方を示すサンプルコードがあるかどうか疑問に思っています。コードスニペットでCore NFC SDKを使用する方法を誰でも示すことができますか?

18
Blisterpeanuts

Apple Developerサイトで、新しいアプリIDを作成し、NFC Tag Reading 有効になっています。

Dev portal capabilities

.plistファイルに次の行を追加します。

<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>

これらを資格ファイルに追加します。

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

対応するファイルでは次のようになります。

enter image description here

また、コアNFCはXcodeの[機能]タブで有効にできます。

enter image description here

Objective-c

インポートCoreNFC

#import <CoreNFC/CoreNFC.h>

そしてデリゲートを設定します:

@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>

ViewDidLoadの場合:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NFCNDEFReaderSession *session = [[NFCNDEFReaderSession alloc] initWithDelegate:self queue:dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT) invalidateAfterFirstRead:NO];
    [session beginSession];
}

デリゲートコールバックで:

- (void) readerSession:(nonnull NFCNDEFReaderSession *)session didDetectNDEFs:(nonnull NSArray<NFCNDEFMessage *> *)messages {

    for (NFCNDEFMessage *message in messages) {
        for (NFCNDEFPayload *payload in message.records) {
            NSLog(@"Payload data:%@",payload.payload);
        }
    }        
}

didInvalidateWithErrorデリゲートコールバックも追加する必要があります。追加しないと、プロトコルに準拠しません。

- (void)readerSession:(nonnull NFCNDEFReaderSession *)session didInvalidateWithError:(nonnull NSError *)error {

}

次の方法でリーダーを停止できます。

[session invalidateSession];

スイフト3/4

インポートCoreNFC

import CoreNFC

そしてデリゲートを設定します:

class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate

ViewDidLoadの場合:

override func viewDidLoad() {
        super.viewDidLoad()

        let session = NFCNDEFReaderSession(delegate: self,
                      queue: DispatchQueue(label: "queueName", attributes: .concurrent), invalidateAfterFirstRead: false)  
        session?.begin()
    }

デリゲートコールバックで:

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
  for message in messages {
    for record in message.records {
      print(record.payload)
    }
  }
}

次の方法でリーダーを停止できます。

session.invalidateSession

使用法

ビューを起動すると、すぐにiOS NFCリーダーダイアログが次のように表示されます。

iOS NFC reader dialog

このダイアログが表示されたら、読みたいNFCタグの近くにiPhoneを1秒ほど置きます。一貫性のある測定値を取得するためにキャンセルして再試行する必要がよくありました 詳細はこちら

32
Boris

この問題を修正するには、com.Apple.developer.nfc.readersession.formats資格ファイルに入力します。キーは、有効なNFSタイプの配列に関連付ける必要があります。たとえば、次のことを試すことができます。

    <array>
        <string>NDEF</string>
    </array>```

It worked for me.

<img src="https://i.stack.imgur.com/I9wHX.png">
5
Maksim Ovtsin

2番目のXcodeベータ用に更新

デベロッパーセンターからアプリにNFC機能を追加します。 識別子 ->アプリID-> "NFCタグ読み取り"を有効にします。

プロジェクトにエンタイトルメントファイルがない場合、Xcodeでアクティブ化してからXcode-> Project Targets-> Capabilities内の任意の機能を非アクティブ化することにより、Xcodeに資格ファイルを作成させます。プロジェクトナビゲータに新しい[AppName] .entitlementsファイルがあります。そのファイルを右クリックし、「開く->ソースコード」を選択します。 <dict></dict>の間に次のエントリを手動で入力します。

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

Xcode 9がNFC Capabilities selectionからのタグ読み取りを有効にするとすぐに、このステップを無効にする必要があるため、このステップは廃止されます。現在の(最初の)ベータバージョンはこれをサポートしません。

IOSがユーザーに表示するプライバシー警告の使用法の説明も入力する必要があります。 (現時点(ベータ1)で、デバイスのスキャン準備が整ったときにこの警告が表示され、このメッセージを含むネイティブシステムダイアログが表示されます。ただし、これは未処理のようです。)ターゲットのInfo.plistを開いて入力を開始します「Privacy」を選択すると、「Privacy-NFC Usage Description」までスクロールダウンしてReturnキーを押して選択できます。右側の列にユーザーにわかりやすい説明を入力します。

これで、SwiftでCoreNFCをインポートできるはずです。

import CoreNFC

次に、Appleの ドキュメント に進みます。

重要:コンパイラーがNo such module 'CoreNFC'でエラーを返す場合、シミュレーターではなく、ビルドする実際のiOS 11デバイスを選択したかどうかを確認します。また、iPhone 7または7 plusでなければなりません。これは将来のバージョンで変更される可能性がありますが、テストNFCは実際のハードウェアでのみ完全に機能します。(cp。シミュレータで実行できるが、実際の機能をテストできないコアBluetooth) ベータ2には、この問題はもうありません。ただし、実際のテストには、iPhone 7/p形式の実際のハードウェアが必要です。

4
ff10

以前の回答を充実させるために、特にNFCNDEFReaderSessionクラスに関するこれらの考慮事項に留意することが重要です。

  • 処理のためのリーダーセッションNFCデータ交換フォーマット(NDEF)タグ。このセッションでは、プロセスに "com.Apple.developer.nfc.readersession.formats"資格が必要です。さらに、アプリケーションのInfo.plistには、空ではない使用法の説明文字列。
  • NDEFリーダーセッションは、自動的にスキャンして検出しますNFC有効なNDEFメッセージを含むフォーラムタグ。NDEF形式のNFCフォーラムタグタイプ1〜5がサポートされています-beginSessionが呼び出されてセッションの開始を通知すると、モーダルシステムUIが表示されます;セッションがユーザーまたは呼び出しによって無効化されると、UIシートは自動的に閉じられます-invalidateSession
  • 開かれたセッションには、-beginSessionが呼び出された後、60秒の時間制限制限があります。制限時間に達すると、-readerSession:didInvalidateWithError:NFCReaderSessionInvalidationErrorSessionTimeoutエラーを返します。
  • システムで許可されるアクティブなリーダーセッションは1つだけです;アクティブなリーダーセッションがある場合、-readerSession:didInvalidateWithError:によって新しいリーダーセッションが開始されると、-beginSessionNFCReaderSessionInvalidationErrorSystemIsBusyを返します。
  • ユーザーがUIの完了ボタンをクリックすると、-readerSession:didInvalidateWithError:NFCReaderSessionInvalidationErrorUserCanceledを返します。
  • -readerSession:didInvalidateWithError:は、クライアントアプリケーションがバックグラウンド状態になったときにNFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedlyを返します-readerSession:didInvalidateWithError:は、のときにNFCReaderErrorUnsupportedFeatureを返します。
    1. リーダーモード機能はハードウェアでは使用できません
    2. クライアントアプリケーションに必要な資格がありません。
3
GoRoS

使用法の説明が適切であることを確認し、Apple Developer Center。私の経験に基づいたチュートリアルがあります(Swift 4ベース)のアプリに機能を追加する必要があります。ここにあります: Core NFC Tutorial

1
Jameson

私の2セント:

1)xcode 9.0(beta 4 9M189t)で、既に機能を追加している場合、手動で追加する必要はありません:

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

自動的に行われます

2)iPhone 7を使用していなくてもクラッシュしないORシミュレーターを使用している場合:

次のように呼び出されます。

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
        print(error.localizedDescription)
    }

「サポートされていない機能」と表示されます

3)お見逃しなく:

self.nfcSession?.begin() // will trigger callback

そう:

    final private func setup(){
    self.nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
    self.nfcSession?.alertMessage = "Put your NFC TAG over iPhone.."
    self.nfcSession?.begin() // will trigger callback

}

4)ユーザーがキャンセルした場合、以下が得られます:

「セッションはユーザーのキャンセルにより無効になります」

didInvalidateWithErrorコールバック。

0
ingconti

Core NFCこれらの回答のリソースを使用してプロジェクトに追加しました。ただし、エンタイトルメントを介して手動で機能を追加しても、Xcodeは表示されないこれはおそらく、Xcode 9 Beta 1が多くの人のサンプルプロジェクトの機能スイッチとしてCore NFCを持たないためです。まだ問題が発生している場合は、少なくとも1つの他の機能をオンにします!これを行うまで、予期しない終了エラーがすぐに返されます。

私はこれをコメントとして残しますが、まだそうするほどの評判はありません。これは十分に重要であると考えられました。

0
Cole