iOS开发-CoreNFC实现NFC标签Tag读取功能

iOS开发-CoreNFC实现NFC标签Tag读取功能
在这里插入图片描述

一、NFC近场通信

近场通信(NFC)是一种无线通信技术,它使设备能够在不使用互联网的情况下相互通信。它首先识别附近配备NFC的设备。NFC常用于智能手机和平板电脑。

二、实现NFC标签Tag读取功能

在iOS中提供了CoreNFC来实现NFC标签Tag读取功能。主要使用的类是NFCTagReaderSession。
NFCTagReaderSession配置读取器会话的RF轮询;可以将多个选项“或”运算在一起。此选项会影响可能的NFC标签类型。同时需要实现delegate来实现扫描的回调。

NFCTagReaderSession初始化

 if (@available(iOS 13.0, *)) {if (NFCNDEFReaderSession.readingAvailable) {self.tagSession = [[NFCTagReaderSession alloc]initWithPollingOption:(NFCPollingISO14443 | NFCPollingISO15693 | NFCPollingISO15693) delegate:self queue:dispatch_get_main_queue()];self.tagSession.alertMessage = @"读取卡片,请将卡片靠近手机";[self.tagSession beginSession]; //开始识别 弹出识别提示框}else{NSLog(@"NFC功能只支持iphone7以及iOS13.0以上设备");}}else{NSLog(@"NFC功能只支持iphone7以及iOS13.0以上设备");}

NFCNDEFReaderSessionDelegate的相关方法

  • 识别结果的回调

-(void)readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages API_AVAILABLE(ios(11.0))

  • 错误回调

-(void)readerSession:(NFCNDEFReaderSession *)session didInvalidateWithError:(NSError *)error API_AVAILABLE(ios(11.0))

  • 在Session无效时调用
  • (void)tagReaderSession:(NFCTagReaderSession *)session didInvalidateWithError:(NSError *)error API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, macos, tvos)
  • 当NFC读取器会话变为Active时调用
  • (void)tagReaderSessionDidBecomeActive:(NFCTagReaderSession *)session API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, macos, tvos)
  • 当读取器在轮询序列中检测到NFC标记时调用
  • (void)tagReaderSession:(NFCTagReaderSession *)session didDetectTags:(NSArray<__kindof id> *)tags API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, macos, tvos)

实现识别NFC标签Tag完整代码如下

#import "INNFCExampleViewController.h"
#import <CoreNFC/CoreNFC.h>API_AVAILABLE(ios(11.0))
@interface INNFCExampleViewController ()<NFCNDEFReaderSessionDelegate, NFCTagReaderSessionDelegate>@property (nonatomic, strong) NFCNDEFReaderSession *session;@property (nonatomic, strong) NFCTagReaderSession *tagSession;@property (nonatomic, strong) id<NFCMiFareTag> currentTag;@property (nonatomic, strong) UILabel *showLabel;@end@implementation INNFCExampleViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor whiteColor];UIButton *startQueryBtn;startQueryBtn = [UIButton buttonWithType:UIButtonTypeCustom];startQueryBtn.frame = CGRectMake(50, 100, 60, 36);startQueryBtn.layer.cornerRadius = 4;startQueryBtn.backgroundColor = [UIColor brownColor];[startQueryBtn setTitle:@"开始识别" forState:UIControlStateNormal];[startQueryBtn addTarget:self action:@selector(startQueryBtnClick) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:startQueryBtn];UIButton *endQueryBtn;endQueryBtn = [UIButton buttonWithType:UIButtonTypeCustom];endQueryBtn.frame = CGRectMake(250, 100, 60, 36);endQueryBtn.layer.cornerRadius = 4;endQueryBtn.backgroundColor = [UIColor brownColor];[endQueryBtn setTitle:@"结束识别" forState:UIControlStateNormal];[endQueryBtn addTarget:self action:@selector(endQueryBtnClick) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:endQueryBtn];
}- (void)startQueryBtnClick {if (@available(iOS 13.0, *)) {if (NFCNDEFReaderSession.readingAvailable) {self.tagSession = [[NFCTagReaderSession alloc]initWithPollingOption:(NFCPollingISO14443 | NFCPollingISO15693 | NFCPollingISO15693) delegate:self queue:dispatch_get_main_queue()];self.tagSession.alertMessage = @"读取卡片,请将卡片靠近手机";[self.tagSession beginSession]; //开始识别 弹出识别提示框}else{NSLog(@"NFC功能只支持iphone7以及iOS13.0以上设备");}}else{NSLog(@"NFC功能只支持iphone7以及iOS13.0以上设备");}/**//如果希望读取多个标签invalidateAfterFirstRead设置为NOif (@available(iOS 11.0, *)) {__weak typeof(self) weakSelf = self;self.session = [[NFCNDEFReaderSession alloc] initWithDelegate:weakSelf queue:dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT) invalidateAfterFirstRead:YES];[self.session beginSession];} else {// Fallback on earlier versions}*/
}- (void)endQueryBtnClick {/**if (@available(iOS 11.0, *)) {[self.session invalidateSession];} else {// Fallback on earlier versions}*/
}#pragma mark -- <NFCNDEFReaderSessionDelegate>//扫描到的回调-(void)readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages API_AVAILABLE(ios(11.0)){for (NFCNDEFMessage *message in messages) {for (NFCNDEFPayload *payload in message.records) {NSLog(@"readerSession payload data = %@", payload.payload);NSString *str = [[NSString alloc] initWithData:payload.payload encoding:NSUTF8StringEncoding];//回到主线程dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"readerSession str:%@",str);});}}
}//错误回调-(void)readerSession:(NFCNDEFReaderSession *)session didInvalidateWithError:(NSError *)error API_AVAILABLE(ios(11.0)){NSLog(@"readerSession didInvalidateWithError error:%@", error);
}#pragma mark -- NFCTagReaderSessionDelegate/*!* @method tagReaderSession:didInvalidateWithError:** @param session   The session object that is invalidated.* @param error     The error indicates the invalidation reason.** @discussion      Gets called when a session becomes invalid.  At this point the client is expected to discard*                  the returned session object.*/
- (void)tagReaderSession:(NFCTagReaderSession *)session didInvalidateWithError:(NSError *)error API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, macos, tvos) {NSLog(@"tagReaderSession didInvalidateWithError error:%@", error);if (error.code == 200) {return;}[session invalidateSession];
}/*!* @method tagReaderSessionDidBecomeActive:** @param session   The session object in the active state.** @discussion      Gets called when the NFC reader session has become active. RF is enabled and reader is scanning for tags.*                  The @link readerSession:didDetectTags: @link/ will be called when a tag is detected.*/
- (void)tagReaderSessionDidBecomeActive:(NFCTagReaderSession *)session API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, macos, tvos) {NSLog(@"tagReaderSession tagReaderSessionDidBecomeActive");
}/*!* @method tagReaderSession:didDetectTags:** @param session   The session object used for tag detection.* @param tags      Array of @link NFCTag @link/ objects.** @discussion      Gets called when the reader detects NFC tag(s) in the polling sequence.*/
- (void)tagReaderSession:(NFCTagReaderSession *)session didDetectTags:(NSArray<__kindof id<NFCTag>> *)tags API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, macos, tvos) {_currentTag = [tags firstObject];NSData *data ;if (self.currentTag.type == NFCTagTypeMiFare) {id<NFCMiFareTag> mifareTag = [self.currentTag asNFCMiFareTag];data = mifareTag.identifier;}else if (self.currentTag.type == NFCTagTypeISO15693){id<NFCISO15693Tag> mifareTag = [self.currentTag asNFCISO15693Tag];data = mifareTag.identifier;}else if (self.currentTag.type == NFCTagTypeISO15693){id<NFCISO15693Tag> mifareTag = [self.currentTag asNFCISO15693Tag];data = mifareTag.identifier;}else{NSLog(@"未识别出NFC格式");}NSString *str = [self convertDataBytesToHex:data];NSLog(@"tagReaderSession didDetectTags str:%@", str);//识别成功处理[session invalidateSession];
}- (NSString *)convertDataBytesToHex:(NSData *)dataBytes {if (!dataBytes || [dataBytes length] == 0) {return @"";}NSMutableString *hexStr = [[NSMutableString alloc] initWithCapacity:[dataBytes length]];[dataBytes enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {unsigned char *dataBytes = (unsigned char *)bytes;for (NSInteger i = 0; i < byteRange.length; i ++) {NSString *singleHexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];if ([singleHexStr length] == 2) {[hexStr appendString:singleHexStr];} else {[hexStr appendFormat:@"0%@", singleHexStr];}}}];return hexStr;
}@end

至此,NFC标签Tag读取功能代码完成。

三、小结

iOS开发-CoreNFC实现NFC标签Tag读取功能

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/151811.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APC学习记录

文章目录 APC概念APC插入、执行过程逆向分析插入过程执行过程总结 代码演示参考资料 APC概念 APC全称叫做异步过程调用&#xff0c;英文名是 Asynchronous Procedure Call&#xff0c;在进行系统调用、线程切换、中断、异常时会进行触发执行的一段代码&#xff0c;其中主要分为…

python 安装成功后终端显示的还是低版本

如果你下载了新版的 Python&#xff0c;但在使用时发现仍然是之前的版本&#xff0c;可能是因为新版的 Python 没有替代系统环境中的旧版 Python。 检查 PATH 环境变量&#xff1a;在命令行中输入 python --version 来查看当前默认的 Python 版本。如果显示的是旧版 Python 的…

[蓝桥杯-610]分数

题面 解答 这一题如果不知道数论结论的话&#xff0c;做这个题会有两种天壤之别的体验 此题包含以下两个数论知识 1. 2^02^12^2...2^(n-1)2^n-1 2. 较大的数如果比较小的数的两倍大1或者小1&#xff0c;则两者互质 所以答案就是2^n-1/2^(n-1) 标程1 我的初次解答 #in…

ChineseChess5 2023.10.28

中国象棋残局&#xff1a;黑双卒单车压境解棋

C/C++数据结构之深入了解线性表:顺序表、单链表、循环链表和双向链表

线性表是一种基本的数据结构&#xff0c;它在计算机科学中起着至关重要的作用。线性表用于存储一系列具有相同数据类型的元素&#xff0c;这些元素之间存在顺序关系。在C/C中&#xff0c;我们可以使用各种方式来实现线性表&#xff0c;其中包括顺序表、单链表、循环链表和双向链…

ES6之Set集合(通俗易懂,含实践)

Set是什么&#xff1f;它的方法有哪些&#xff1f;它在实例开发中有什么作用&#xff1f; 让我为大家介绍一下吧&#xff01; ES6提供了新的数据结构 Set(集合) 。它类似于数组&#xff0c;但成员的值是唯一的&#xff0c;常用于数组去重。 创建方法&#xff1a; let s new S…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)

由于之前哔站作者整理的LUNA16数据处理方式过于的繁琐&#xff0c;于是&#xff0c;本文就对LUNA16数据做一个新的整理&#xff0c;最终得到的数据和形式是差不多的。但是&#xff0c;主要不同的是代码逻辑比较的简单&#xff0c;便于理解。 对于数据集的学习&#xff0c;可以…

如何使用drawio画流程图以及导入导出

画一个基本的流程图 你可以在线使用drawio, 或者drawon创建很多不同类型的图表。 如何使用编辑器&#xff0c;让我们以一个最基本的流程图开始。 流程图&#xff0c;就是让你可视化的描述一个过程或者系统。 图形和很少部分的文字表达就可以让读者很快的理解他们需要什么。 创…

代码随想录Day31 贪心06 T738 单调递增的数字 T968监控二叉树

LeetCode T738 单调递增的数字 题目链接:738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 我们以332举例,题目要我们获得的是小于等于332的最大递增数字,我们知道这个数字要递增只能取299了,332 -- 329 --299 我们从后向前遍历,只要前一位大于后一位,我…

【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 单例设计模式 Java单例设计模式 Java单例设计模…

数组与链表算法-矩阵算法

目录 数组与链表算法-矩阵算法 矩阵相加 C代码 矩阵相乘 C代码 转置矩阵 C代码 稀疏矩阵 C代码 数组与链表算法-矩阵算法 矩阵相加 矩阵的相加运算较为简单&#xff0c;前提是相加的两个矩阵对应的行数与列数必须相等&#xff0c;而相加后矩阵的行数与列数也是相同的。…

Hadoop分布式安装

首先准备好三台服务器或者虚拟机&#xff0c;我本机安装了三个虚拟机&#xff0c;安装虚拟机的步骤参考我之前的一篇 virtualBox虚拟机安装多个主机访问虚拟机虚拟机访问外网配置-CSDN博客 jdk安装 参考文档&#xff1a;Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并…