iOS11 Core NFC


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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • iOS11 Core NFC iPhone6開始支持NFC(Near Field Communication )...
    繚霧閱讀 1,939評論 13 3
  • 原文鏈接: http://fighting300.com... 大家可能聽過NFC這項功能,或者有可能你每天都在使...
    fighting300閱讀 4,643評論 10 8
  • 本篇文章共分為三個部分,讀者可根據需要直接閱讀對應部分: 1. iOS 對NFC支持的現狀 2.NFC基本概念與相...
    Cstars閱讀 11,585評論 3 9
  • 我站在秋的細雨里 你輕輕的來了 住進了我的日子里 我搖晃路旁的大樹 葉子掉了滿地 你走了 帶著葉子的情懷 去了很遠...
    田萍閱讀 196評論 1 4
  • 今天上午,一位異性畫友(我猜的)發來賀信,祝賀我獲得了公司舉辦的作品展覽活動的一等獎,同時也發了一個紅包過來。 除...
    涯為漫畫癡閱讀 426評論 4 12