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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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登录、有消…

【Linux】第九站:make和makefile

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

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

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

如何使用 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命令运行…

从前序与中序遍历序列构造二叉树

代码如下&#xff0c;开袋即食 class Solution {private Map<Integer,Integer> map;public TreeNode buildTree(int[] preorder, int[] inorder) {map new HashMap<>();for(int i 0;i<preorder.length;i){map.put(inorder[i],i);}return build(preorder,inord…

Qt5 安装 phonon

Qt5 安装 phonon Qt5 安装 phonon问题描述安装组件 Qt5 安装 phonon 开发环境&#xff1a;Qt Creator 4.6.2 Based on Qt 5.9.6 问题描述 在运行 Qt5 项目时&#xff0c;显示错误&#xff1a; error: Unknown module(s) in QT: phonon这是缺少组件的原因&#xff0c;QT: pho…

解析mfc100u.dll文件丢失的修复方法,快速解决mfc100u.dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“缺少某个文件”的错误。最近&#xff0c;我也遇到了一个这样的问题&#xff0c;那就是“mfc100u.dll丢失”。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给我们带来困扰。…

【广州华锐互动】VR虚拟现实旅游:改变游客旅游方式,提升旅游体验

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种利用电脑模拟产生一个三维的虚拟世界&#xff0c;提供用户关于视觉、听觉、触觉等感官的模拟体验。随着科技的进步&#xff0c;VR虚拟现实技术已逐渐进入各行各业&#xff0c;尤其在旅游行业中的应用&…

陪诊系统|挂号陪护搭建二开陪诊师入驻就医小程序

我们的陪诊小程序拥有丰富多样的功能&#xff0c;旨在最大程度满足现代人的需求。首先&#xff0c;我们采用了智能排队系统&#xff0c;通过扫描二维码获取排号信息&#xff0c;让您从繁琐的排队过程中解放出来。其次&#xff0c;我们提供了多种支付方式&#xff0c;不仅可以实…

1985-2020年我国30m土地利用覆盖数据介绍

土地覆盖(LC)决定了地球各圈层之间的能量交换、水和碳循环。准确的 LC 信息是环境和气候研究的基本参数。考虑到在过去几十年中&#xff0c;随着经济建设的发展&#xff0c;中国发生了巨大的变化&#xff0c;连续和精细的 LC 监测是迫切需要的。然而&#xff0c;目前&#xff0…

【Python爬虫】selenium4新版本使用指南

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0c;Opera&am…

真实经历分享:性能测试需求分析详解

在实际的工作中系统的性能需求通常是一个笼统的需求&#xff0c;而且有可能给提需求的人并不知道具体的性能需要&#xff0c;所以只能含糊的列出。如果测试人员不搞清楚&#xff0c;就会出现实际要把杀猪刀&#xff0c;需求标明能屠龙&#xff01;&#xff01;&#xff01; 下面…