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.mzph.cn/news/126878.shtml

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

相关文章

ConcurrentLinkedDeque详解-Deque接口链表实现方案

简介 ConcurrentLinkedDeque是一种基于链表实现的线程安全的双端队列Deque。它提供了高效的并发访问和操作&#xff0c;适用于高并发场景下的数据共享和交互。 主要特点 线程安全 &#xff1a;ConcurrentLinkedDeque通过使用线程安全的并发控制机制&#xff0c;如内部分锁和C…

1985-2022年全国各地级市绿色专利申请和授权数据

1985-2022年全国各地级市绿色专利申请和授权数据 1、时间&#xff1a;1985-2022年 2、指标&#xff1a;年份、地区、行政区划代码、所属省份、所属地域、绿色专利申请总量、绿色专利申请_发明专利、绿色专利申请_实用新型专利、绿色专利授权总量、绿色专利授权_发明专利、绿色…

一种FSK信号符号同步的思想

FSK原理 FSK利用频率传输信息,即将信息流调制到频率上。以最简单的2FSK通俗来讲,用2个不同的频率 f 1 f_1 f1

【Django】项目模型

Django的基本命令 django-admin 命令含义startproject启动Django项目startapp启动Django应用check检查项目完整性runserver本地运行项目shell进入Django项目的Python Shell环境test 进行Django用例测试makemigrations创建模型变更的迁移文件migrate执行makemigrations…

外贸网站建设攻略:如何建设一个高效的外贸网站

外贸网站是外贸企业展示自己的产品和服务&#xff0c;吸引和沟通国外客户&#xff0c;实现网络营销的重要工具。一个高效的外贸网站不仅要有美观的界面&#xff0c;还要有强大的功能和优化。那么&#xff0c;九凌网络分享如何建设一个高效的外贸网站呢&#xff1f; 第一步&…

Unity 报警告warning CS0649: Field ‘...‘ is never assigned to,...解决办法

文章目录 1. 现象2. 警告出现原因3. 解决方法 1. 现象 2. 警告出现原因 该警告应仅出现在私有成员变量中。那些不能从外部设置&#xff0c;这就是为什么编译器可以确定这些变量没有在任何地方蛇者其值。在C&#xff03;中&#xff0c;没有访问修饰符的变量&#xff08;private…

useState和useReducer的区别?

文章目录 前言区别总结后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;感谢大家指出…

el-date-picker如何选择规定范围内的时间(十天以内的时间)

这个需求是可以选择之后来计算,选择当前日期之后自动计算当前日期前后的十天以内的日期 如下图 就是19号前面十天的日期 以及后面十天的日期(包含当天) 需要用到elementUI el-date-picker是Element UI库中的一个组件&#xff0c;用于日期选择 <el-date-picker v-model&q…

AI:46-基于深度学习的垃圾邮件识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

第20期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

Tigger绕过激活锁/屏幕锁隐藏工具,支持登入iCloud有消息通知,支持iOS12.0-14.8.1。

绕过激活锁工具Tigger可以用来帮助因为忘记自己的ID或者密码而导致iPhone/iPad无法激活的工具来绕过自己的iPhone/iPad。工具支持Windows和Mac。 工具支持的功能&#xff1a; 1.Hello界面两网/三网/无基带/乱码绕过&#xff0c;可以完美重启&#xff0c;支持iCloud登录、有消…

Spring Authorization Server入门 (十九) 基于Redis的Token、客户端信息和授权确认信息存储

怎么使用Spring Data Redis实现Spring Authorization Server的核心services&#xff1f; 本文对应的是文档中的How-to: Implement core services with JPA&#xff0c;文档中使用Jpa实现了核心的三个服务类&#xff1a;授权信息、客户端信息和授权确认的服务&#xff1b;本文会…

【Linux】第九站:make和makefile

文章目录 一、 Linux项目自动化构建工具make/Makefile1.make/makefile工作现象2.依赖关系与依赖方法3.如何清理4.为什么这里我们需要带上clean5.连续的make6.特殊符号 二、Linux下实现一个简单的进度条1.回车换行2.缓冲区3.倒计时的实现 一、 Linux项目自动化构建工具make/Make…

【Docker 内核详解】cgroups 资源限制(三):实现方式及工作原理简介

实现方式及工作原理简介 1.cgroups 如何判断资源超限及超出限额之后的措施2.cgroup 与任务之间的关联关系3.Docker 在使用 cgroup 时的注意事项4./sys/fs/cgroup/cpu/docker/[container-ID] 下文件的作用 在对 cgroups 规则和子系统有了一定了解以后&#xff0c;下面简单介绍操…

图解刘润2023年度演讲--进化的力量思维导图精华

大家好&#xff0c;我是老原。 周末&#xff0c;商业顾问刘润发表了年度演讲&#xff1a;《进化的力量&#xff1a;寒武纪大爆发》。 这两天出差期间&#xff0c;陆陆续续看完了这个长达4小时的演讲&#xff0c;梳理了2023年到底发生了些什么&#xff0c;现在的环境如何…… …

splice,slice,split傻傻分不清?

做个笔记&#x1f4d2; 一、splice数组方法&#xff0c;更改原数组 使用方法&#xff1a; splice(start) splice(start, deleteCount) splice(start, deleteCount, item1) splice(start, deleteCount, item1, item2, itemN) start: 开始索引 deleteCount&#xff1a;需要删除的…

深入理解强化学习——强化学习的历史:时序差分学习

分类目录&#xff1a;《深入理解强化学习》总目录 相关文章&#xff1a; 强化学习的历史&#xff1a;最优控制 强化学习的历史&#xff1a;试错学习 强化学习的历史&#xff1a;试错学习的发展 强化学习的历史&#xff1a;K臂赌博机、统计学习理论和自适应系统 强化学习的…

如何使用 Docker 搭建 Jenkins 环境?从安装到精通

不少兄弟搭 jenkins 环境有问题&#xff0c;有的同学用 window, 有的同学用 mac&#xff0c; 有的同学用 linux。 还有的同学公司用 window, 家里用 mac&#xff0c;搭个环境头发掉了一地。。。 这回我们用 docker 去搭建 jenkins 环境&#xff0c;不管你是用的是什么系统&…

opencv在linux上调用usb摄像头进行拍照

功能 1.按照指定的文件名创建文件夹&#xff0c;创建之前判断该文件夹是否存在 2.调用摄像头按可调整窗口大小的方式显示 3.按esc退出摄像头画面 4.按p保存当前摄像头的画面&#xff0c;并按当前时间为照片的名字进行保存打开终端查看是否有摄像头 ls /dev/video*一般video1就…

面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......

一、Linux系统应用和环境配置&#xff1a; 1、Linux系统的操作命令给我说10个&#xff0c;一般用什么工具远程连接Linux服务器&#xff1f; 2、Linux中的日志存储在哪里&#xff1f;怎么查看日志内容&#xff1f; 3、Linux中top和ps命令的区别&#xff1f; 4、Linux命令运行…