iOS之NFC使用

A訫飛Flyme發表於2017-12-20

CoreNFC沒有標誌圖示,換上女神的

先了解幾個概念 什麼是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會自動幫你新增其他步驟
Xcode.png
#####然後 在你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>
複製程式碼

info.png
#####最後 程式碼上也很簡單

#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

相關文章