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