先了解幾個概念 什麼是NFC? NDEF指的是什麼? 什麼是CoreNFC?
###什麼是 NFC NFC(Near Field Communication)即近距離無線通訊技術。該技術由飛利浦公司和索尼公司共同開發,可以在移動裝置、消費類電子產品、PC 和智慧控制元件工具間進行近距離無線通訊。NFC提供了一種簡單、觸控式的解決方案,可以讓消費者簡單直觀地交換資訊、訪問內容與服務。 NFC通訊技術,允許電子裝置之間進行非接觸式點對點資料傳輸(在十釐米內)交換資料。這個技術由免接觸式射頻識別(RFID)演變而來,並向下相容RFID,主要用於手機等手持裝置中提供M2M(Machine to Machine)的通訊。由於近場通訊具有天然的安全性。 NFC是一種短距高頻的無線電技術,在13.56MHz頻率執行於10釐米距離內。其傳輸速度有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資料交換格式,NFC組織約定的NFC tag中的資料格式。
NDEF是輕量級的緊湊的二進位制格式,可帶有URL、vCard和NFC定義的各種資料型別。
NDEF的由各種資料記錄組成,而各個記錄由報頭(Header)和有效載荷(Payload)組成,其中NDEF記錄的資料型別和大小由記錄載荷的報頭註明,這裡的報頭包含3部分,分別為Length、Type和Identifier.。
NFC Data Exchange Format : NFC資料交換格式,NFC組織約定的NFC tag中的資料格式。NDEF修詳解
###什麼是CoreNFC?
CoreNFC是蘋果推出的支援NFC通訊的框架,僅支援裝有iOS 11的iPhone 7和iPhone 7Plus,Xcode 9 beta版。CoreNFC讀取的是NDEF標籤的資料。(吐槽下,為毛必須7以上的裝置,這是又要換手機的節奏啊)
##iOS開發部分 #####首先 在你的開發者賬號裡面新增上對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];//關閉以前的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