iOS 11核心NFC - 任何示例代码?

Bli*_*uts 19 beta nfc ios core-nfc

我刚刚在iPhone 7上安装了第一个iOS 11测试版,我对尝试NFC感兴趣.在设置中没有任何关于它.我想知道是否有任何示例代码显示如何读取标记.任何人都可以在代码片段中展示如何使用Core NFC SDK吗?

Bor*_*ris 33

在Apple Developer站点中,创建一个新的App ID并确保NFC Tag Reading已启用.

开发门户功能

将以下行添加到.plist文件中:

<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>
Run Code Online (Sandbox Code Playgroud)

以及这些权利文件:

<key>com.apple.developer.nfc.readersession.formats</key>
    <array>
        <string>NDEF</string>
    </array>
Run Code Online (Sandbox Code Playgroud)

它应该在相应的文件中看起来像这样:

在此输入图像描述

此外,还可以通过Xcode中的Capabilities选项卡启用Core NFC.

在此输入图像描述

Objective-C的

进口 CoreNFC

#import <CoreNFC/CoreNFC.h>
Run Code Online (Sandbox Code Playgroud)

并设置委托:

@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>
Run Code Online (Sandbox Code Playgroud)

在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];
}
Run Code Online (Sandbox Code Playgroud)

在委托回调中:

- (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);
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

您还必须添加didInvalidateWithError委托回调,否则您将不符合协议:

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

}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式阻止读者:

[session invalidateSession];
Run Code Online (Sandbox Code Playgroud)

斯威夫特3/4

进口 CoreNFC

import CoreNFC
Run Code Online (Sandbox Code Playgroud)

并设置委托:

class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate
Run Code Online (Sandbox Code Playgroud)

在viewDidLoad中:

override func viewDidLoad() {
        super.viewDidLoad()

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

在委托回调中:

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

您可以通过以下方式阻止读者:

session.invalidateSession
Run Code Online (Sandbox Code Playgroud)

用法

启动视图后,您应立即看到iOS NFC阅读器对话框,如下所示:

iOS NFC阅读器对话框

一旦出现此对话框,您将有大约一秒钟将iPhone放置在您想要阅读的NFC标签附近.否则,该字段被停用(这似乎是苹果公司的一个错误).我经常需要取消并重试以获得一致的读数.更多细节在这里.


Mak*_*sin 5

要解决此问题,您可以将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">
Run Code Online (Sandbox Code Playgroud)

  • 这是描述的关键。`NFCReaderUsageDescription` (3认同)