About Core NFC
Core NFC支持的讀取數(shù)據(jù)類型:
image.png
Core NFC框架特性/要求
- 目前支持NFC Tags(標(biāo)簽)的讀取
- 不支持輸出和格式設(shè)置
- 僅支持iphone 7 & iphone 7plus,且iOS11系統(tǒng)
項(xiàng)目加入Core NFC框架使用的要求
- (必須)支持iOS11,且只有iOS11和iphone7/plus機(jī)型才可以
- (必須)像Apple pay或者Push Notification一樣,需要添加一個(gè)entitlement
- (保修)在plist文件中添加Privacy - NFC Scan Usage Description。這里使用的描述信息會(huì)顯示在讀取界面中
image.png
image.png
集成Core NFC中的一些細(xì)節(jié)說明
- 設(shè)備讀取標(biāo)簽是一個(gè)被動(dòng)的過程,所以需要程序主動(dòng)發(fā)起一個(gè)會(huì)話即為session去讀取標(biāo)簽。與處理攝像頭相關(guān)功能類似,所有的操作都必須建立在session基礎(chǔ)之上
- 程序必須始終保持前臺(tái)運(yùn)行并且識(shí)別界面可視。如果至于后臺(tái)session會(huì)自動(dòng)終止,讀取失敗。
- Tips:這里我做過一個(gè)測(cè)試,實(shí)際上當(dāng)Core NCF讀取標(biāo)簽界面出現(xiàn)后,無法下拉通知欄中心,也無法上滑出現(xiàn)控制中心,如果識(shí)別過程中,點(diǎn)擊home第一次會(huì)取消識(shí)別,不會(huì)直接進(jìn)入主屏幕。這樣的設(shè)計(jì)應(yīng)該是為了防止在識(shí)別過程中出現(xiàn)誤操作等情況的發(fā)生
- 讀取標(biāo)簽被限制的60秒之內(nèi)。意思就是60秒內(nèi)標(biāo)簽必須識(shí)別完成,否則session會(huì)自動(dòng)終止。如果會(huì)話過期或者未經(jīng)過驗(yàn)證,則你的程序需要重新去建立新的會(huì)話
- Core NFC可以設(shè)置會(huì)話讀取一個(gè)標(biāo)簽或者多個(gè)標(biāo)簽。在讀取單個(gè)標(biāo)簽的時(shí)候,讀取完成后,會(huì)話自動(dòng)終止。如果讀取多個(gè)標(biāo)簽,會(huì)話會(huì)一直持續(xù)直到程序主動(dòng)終止會(huì)話或者60秒后。60秒是一個(gè)最大的節(jié)點(diǎn)
示例代碼
代碼很簡(jiǎn)單!!!其實(shí)Core NFC目前放出的權(quán)限很少,只支持特定格式的NFC數(shù)據(jù)讀取,不支持輸出和格式設(shè)置,所以代碼上很簡(jiǎn)單,可以說是傻瓜式的調(diào)用處理即可。我猜想可能是因?yàn)锳pple為了保證Apple Pay的安全性,畢竟Apple Pay也是采用NFC完成支付。
使用Core NFC
- @import CoreNFC 導(dǎo)入框架,這點(diǎn)沒啥可說的
- 遵循 NFCNDEFReaderSessionDelegate 協(xié)議
- 創(chuàng)建 NFCNDEFReaderSession 實(shí)例
- 開啟 NFCNDEFReaderSession 以及處理協(xié)議回調(diào)方法
具體代碼如下如下
// @import CoreNFC 導(dǎo)入框架
// 遵循 NFCNDEFReaderSessionDelegate 協(xié)議
#import "ViewController.h"
#include <sys/types.h>
#include <sys/sysctl.h>
@import CoreNFC;
@interface ViewController ()<NFCNDEFReaderSessionDelegate>
@end
@implementation ViewController
// 創(chuàng)建 NFCNDEFReaderSession 實(shí)例,開啟NFCNDEFReaderSession
// Tips:開啟
// 條件:iphone7/7plus運(yùn)行iOS11
if ([ViewController isiPhone7oriPhone7Plus] && [UIDevice currentDevice].systemVersion.floatValue >= 11.0) {
// ReadingAvailable is YES if device supports NFC tag reading.
if ([NFCNDEFReaderSession readingAvailable]) {
// beginScanning
// invalidateAfterFirstRead 屬性表示是否需要識(shí)別多個(gè)NFC標(biāo)簽,如果是YES,則會(huì)話會(huì)在第一次識(shí)別成功后終止。否則會(huì)話會(huì)持續(xù)
// 不過有一種例外情況,就是如果響應(yīng)了-readerSession:didInvalidateWithError:方法,則是否為YES,會(huì)話都會(huì)被終止
NFCNDEFReaderSession *session = [[NFCNDEFReaderSession alloc] initWithDelegate:self queue:nil invalidateAfterFirstRead:YES];
[session beginSession];
}
}
// 處理協(xié)議回調(diào)方法
#pragma mark - NFCReaderSessionDelegate
// Check invalidation reason from the returned error. A new session instance is required to read new tags.
// 識(shí)別出現(xiàn)Error后會(huì)話會(huì)自動(dòng)終止,此時(shí)就需要程序重新開啟會(huì)話
- (void)readerSession:(NFCNDEFReaderSession *)session didInvalidateWithError:(NSError *)error {
// error明細(xì)參考NFCError.h
NSLog(@"%@",error);
}
// Process detected NFCNDEFMessage objects
- (void)readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages {
// 數(shù)組messages中是NFCNDEFMessage對(duì)象
// NFCNDEFMessage對(duì)象中有一個(gè)records數(shù)組,這個(gè)數(shù)組中是NFCNDEFPayload對(duì)象
// 參考NFCNDEFMessage、NFCNDEFPayload類
// 解析數(shù)據(jù)
for (NFCNDEFMessage *message in messages) {
for (NFCNDEFPayload *playLoad in message.records) {
NSLog(@"typeNameFormat : %d", playLoad.typeNameFormat);
NSLog(@"type : %@", playLoad.type);
NSLog(@"identifier : %@", playLoad.identifier);
NSLog(@"playload : %@", playLoad.payload);
}
}
}
// 主動(dòng)終止會(huì)話,調(diào)用如下方法即可。
[session invalidateSession];
運(yùn)行效果圖
image.png
image.png
由于身邊的NFC卡片都未識(shí)別成功,所以圖二識(shí)別完成后的截圖為WWDC視頻中的截圖。
通過測(cè)試,目前用iphone7plus+iOS11測(cè)試讀取上海交通卡、公司門禁卡,都沒有讀取成功,代碼邏輯應(yīng)該沒有問題。可能是這些NFC芯片數(shù)據(jù)格式問題?不太確定是什么原因。不過貌似網(wǎng)上有人說是iOS11的問題,可以等iOS11正式版發(fā)布后再試試看,我也會(huì)持續(xù)關(guān)注。如果大家有相關(guān)的答案也可以告知我。謝謝。
資料
https://github.com/EchoZuo/iOSCoreNFC
https://developer.apple.com/documentation/corenfc#overview
https://developer.apple.com/videos/play/wwdc2017/718/
https://stackoverflow.com/questions/44380305/ios-11-core-nfc-any-sample-code
Info
- Blog:https://echozuo.github.io
- Github:https://github.com/EchoZuo
- Email: zuoqianheng@foxmail.com
- CSDN:https://blog.csdn.net/zuoqianheng
- Telegram:@echozuo