
先了解幾個概念
什么是NFC?
NDEF指的是什么?
什么是CoreNFC?
什么是 NFC
NFC(Near Field Communication)即近距離無線通訊技術(shù)。該技術(shù)由飛利浦公司和索尼公司共同開發(fā),可以在移動設備、消費類電子產(chǎn)品、PC 和智能控件工具間進行近距離無線通信。NFC提供了一種簡單、觸控式的解決方案,可以讓消費者簡單直觀地交換信息、訪問內(nèi)容與服務。
NFC通信技術(shù),允許電子設備之間進行非接觸式點對點數(shù)據(jù)傳輸(在十厘米內(nèi))交換數(shù)據(jù)。這個技術(shù)由免接觸式射頻識別(RFID)演變而來,并向下兼容RFID,主要用于手機等手持設備中提供M2M(Machine to Machine)的通信。由于近場通訊具有天然的安全性。
NFC是一種短距高頻的無線電技術(shù),在13.56MHz頻率運行于10厘米距離內(nèi)。其傳輸速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三種。目前近場通信已通過成為ISO/IEC IS 18092國際標準、ECMA-340標準與ETSI TS 102 190標準。NFC采用主動和被動兩種讀取模式。
NFC的百度百科
NFC通信

NDEF指的是什么?
NFC Data Exchange Format : NFC數(shù)據(jù)交換格式,NFC組織約定的NFC tag中的數(shù)據(jù)格式。
NDEF是輕量級的緊湊的二進制格式,可帶有URL、vCard和NFC定義的各種數(shù)據(jù)類型。
NDEF的由各種數(shù)據(jù)記錄組成,而各個記錄由報頭(Header)和有效載荷(Payload)組成,其中NDEF記錄的數(shù)據(jù)類型和大小由記錄載荷的報頭注明,這里的報頭包含3部分,分別為Length、Type和Identifier.。
NFC Data Exchange Format : NFC數(shù)據(jù)交換格式,NFC組織約定的NFC tag中的數(shù)據(jù)格式。NDEF修詳解
什么是CoreNFC?
CoreNFC是蘋果推出的支持NFC通訊的框架,僅支持裝有iOS 11的iPhone 7和iPhone 7Plus,Xcode 9 beta版。CoreNFC讀取的是NDEF標簽的數(shù)據(jù)。(吐槽下,為毛必須7以上的設備,這是又要換手機的節(jié)奏?。?/code>
iOS開發(fā)部分
首先
在你的開發(fā)者賬號里面添加上對NFC的支持:
(很簡單,只需要配置App ID支持NFC,更新Provisioning Profiles)

其次
在你的XCode中添加TARGETS->Capabilities中打開Near Field Communication Tag Reading選項,XCode會自動幫你添加其他步驟

然后
在你Project的info.plist中添加:
Privacy - NFC Scan Usage Description
NFC usage description
com.apple.developer.nfc.readersession.formats
NDEF
<key>NFCReaderUsageDescription</key>
<string>NFC Test</string>
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>

最后
代碼上也很簡單
#import "SLViewController.h"
#import <CoreNFC/CoreNFC.h>
@interface SLViewController ()<NFCNDEFReaderSessionDelegate>
@property (strong, nonatomic) NFCNDEFReaderSession *session;
@end
//---------------------------
- (IBAction)NFCAction:(id)sender {
[self coreNFCAlloc];
}
-(void)coreNFCAlloc{
[self.session invalidateSession];//關(guān)閉以前的Session
self.session = [[NFCNDEFReaderSession alloc] initWithDelegate:self
queue:nil
invalidateAfterFirstRead:NO];
if (NFCNDEFReaderSession.readingAvailable) {
self.session.alertMessage = @"把卡放到手機背面";
[self.session beginSession];//啟動 Session
} else {
NSLog(@"此設備不支持NFC");
}
}
#pragma mark - NFCNDEFReaderSessionDelegate
- (void)readerSession:(NFCNDEFReaderSession *)session didInvalidateWithError:(NSError *)error{
// 讀取失敗
NSLog(@"%@",error);
if (error.code == 201) {
NSLog(@"掃描超時");
}
if (error.code == 200) {
NSLog(@"取消掃描");
}
}
- (void)readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray*)messages
{
// 讀取成功
for (NFCNDEFMessage *msg in messages) {
NSArray *ary = msg.records;
for (NFCNDEFPayload *rec in ary) {
NFCTypeNameFormat typeName = rec.typeNameFormat;
NSData *payload = rec.payload;
NSData *type = rec.type;
NSData *identifier = rec.identifier;
NSLog(@"TypeName : %d",typeName);
NSLog(@"Payload : %@",payload);
NSLog(@"Type : %@",type);
NSLog(@"Identifier : %@",identifier);
}
}
}
注意:
1.開啟一個session,并且同時只能開啟一個
2.App完全在前臺模式,切入后臺失效
3.session最多掃存活60s,超時必須重啟新session
END