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

我刚刚安装了第一个iOS 11testing版到iPhone 7,并有兴趣尝试NFC。 没有什么关于它的设置。 我想知道是否有任何示例代码显示如何阅读标签。 任何人都可以在代码片段中展示如何使用Core NFC SDK?

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

开发者门户功能

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

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

和这些权利文件:

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

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

在这里输入图像说明

Core NFC也可以通过Xcode中的Capabilities选项卡启用。

在这里输入图像说明

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]; } 

在委托callback中:

 - (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委托callback,否则您将不符合协议:

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

你可以停止阅读器:

 [session invalidateSession]; 

Swift 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() } 

在委托callback中:

 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阅读器对话框

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

为了解决这个问题,你应该添加com.apple.developer.nfc.readersession.formats键到你的授权文件中。 密钥应该与启用的nfstypes的数组相关联。 举例来说,您可以将其添加到您的权利。

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

它为我工作。

更新了第二个Xcodetesting版。

从开发人员中心将NFCfunction添加到您的应用程序。 标识符 – >应用程序ID – >启用“NFC标签读取”。

如果您的项目没有授权文件,让Xcode通过激活,然后停用Xcode – > Project Targets – > Capabilities中的任何function来为您创build一个。 您将在项目导航器中find一个新的[AppName] .entitlements文件。 右键单击该文件并select“打开为 – >源代码”。 在<dict></dict>之间手动input以下条目:

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

只要Xcode 9允许从Capabilities选项中启用NFC标签读取,这一步就变得过时了,因为您只需要在那里启用它。 目前的(第一)testing版本不支持这个。

您还需要input隐私警告的使用说明,iOS会向用户显示。 (此时(testing版1),当设备准备扫描并显示一个包含此信息的本地系统对话框时,将显示此警告。但是,这看起来是不可靠的。)打开目标的Info.plist并开始键入“隐私”,你可以向下滚动到“隐私 – NFC使用说明”,通过点击返回来select它。 在右栏input一个有意义的解释给你的用户。

现在你应该可以在Swift中导入CoreNFC了:

 import CoreNFC 

然后转到苹果的文档 。

重要提示 :如果编译器在No such module 'CoreNFC'返回错误,请检查是否select了用于构build的实际iOS 11设备,而不是模拟器。 它也必须是iPhone 7或7 plus。 这可能会在未来版本中发生变化,但是testingNFC只能完全与实际硬件配合使用。 (核心蓝牙,你可以在模拟器上运行,但不testing实际的function。) Beta 2不再有这个问题了。 然而,实际testing仍然需要iPhone 7 / pforms的实际硬件。

为了丰富以前的答案,重要的是要牢记NFCNDEFReaderSession类的这些注意事项:

  • 用于处理NFC数据交换格式(NDEF)标签的读取器会话。 此会话需要在您的过程中拥有“ com.apple.developer.nfc.readersession.formats ”权利。 此外,您的应用程序的Info.plist必须包含非空的使用说明string。
  • NDEF阅读器会话将自动扫描并检测包含有效NDEF消息的NFC论坛标签。 支持NFC论坛标签types1至5,即NDEF格式 。 一旦调用了-beginSession来通知会话的开始,模态系统UI将呈现; 当用户或通过调用-invalidateSession使会话失效时,UI表会被自动解除。
  • 打开的会话在-beginSession之后有60秒的时间限制-readerSession:didInvalidateWithError:达到时间限制时,将返回NFCReaderSessionInvalidationErrorSessionTimeout错误。
  • 系统中只允许有一个活动的阅读器会话-readerSession:didInvalidateWithError:当有一个活动的阅读器会话时,当新的阅读器会话由-beginSession启动时,将返回NFCReaderSessionInvalidationErrorSystemIsBusy
  • -readerSession:didInvalidateWithError:当用户单击UI上的完成button时,将返回NFCReaderSessionInvalidationErrorUserCanceled
  • -readerSession:didInvalidateWithError: 当客户端应用程序进入后台状态时,将返回NFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedly-readerSession:didInvalidateWithError:将在返回NFCReaderErrorUnsupportedFeature时返回
    1. 阅读器模式function在硬件上不可用
    2. 客户端应用程序没有所需的权利。

您需要确保使用说明已经到位,并且还要将能力添加到Apple开发人员中心内的应用程序中。 我有一个基于我的经验(基于Swift 4)的教程。 它在这里可用: 核心NFC教程

在这些答案中,我使用资源将Core NFC添加到项目中。 另外一个没有注意的事情是,即使你通过授权手动添加function,Xcode似乎没有看到文件,除非你有能力打开。 这可能是由于Xcode 9 Beta 1没有将Core NFC作为许多人的示例项目的能力开关。 所以,如果您仍然看到问题,请务必至lessclosures一个其他function! 我看到一个意外的终止错误立即返回,直到我做到了这一点。

我会留下这个评论,因为它属于,但是还没有足够的声望去做。 认为这很重要,需要注意。

我的两分钱:

1)在xcode 9.0(beta 4 9M189t)下如果你已经添加了function,不需要手动添加:

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

它是自动完成的

2)没有崩溃,如果不使用iPhone 7或者你在模拟器:

你将被召唤:

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

它会显示:“不支持的function”

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)如果用户取消,你会得到:

“会话通过用户取消而失效”

在didInvalidateWithErrorcallback。