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阅读器对话框如下所示:
一旦出现此对话框,您将有一秒钟将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
然后转到苹果的文档 。
重要提示 :如果编译器在 Beta 2不再有这个问题了。 然而,实际testing仍然需要iPhone 7 / pforms的实际硬件。 No such module 'CoreNFC'
返回错误,请检查是否select了用于构build的实际iOS 11设备,而不是模拟器。 它也必须是iPhone 7或7 plus。 这可能会在未来版本中发生变化,但是testingNFC只能完全与实际硬件配合使用。 (核心蓝牙,你可以在模拟器上运行,但不testing实际的function。)
为了丰富以前的答案,重要的是要牢记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
时返回- 阅读器模式function在硬件上不可用
- 客户端应用程序没有所需的权利。
您需要确保使用说明已经到位,并且还要将能力添加到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。