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

这篇具有很好参考价值的文章主要介绍了iOS开发-CoreNFC实现NFC标签Tag读取功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

iOS开发-CoreNFC实现NFC标签Tag读取功能
iOS开发-CoreNFC实现NFC标签Tag读取功能,移动开发,iphone开发,Objective-c,1024程序员节,android,flutter,objective-c

一、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设置为NO
     if (@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读取功能

学习记录,每天不停进步。文章来源地址https://www.toymoban.com/news/detail-733483.html

到了这里,关于iOS开发-CoreNFC实现NFC标签Tag读取功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 实现 NFC 读取卡片信息

    效果图: 因为朋友需要个读取NFC卡片数据的功能,所以最近看了一下Android 系统下NFC 读取卡片信息的操作。 NFC(近距离无线通信 ) 是一组近距离无线技术,通常只有在距离不超过 4 厘米时才能启动连接.借助 NFC,您可以在 NFC 标签与 Android 设备之间或者两台 Android 设备之间共享小

    2024年02月01日
    浏览(30)
  • dedecms如何实现tag标签伪静态的方法

    dedecms的tag标签是一个很好管理的功能,通过tag标签可以找到相关的内容。但是dedecms的tag标签系统默认是//www.yii666.net/tags.php?/tag标签/如下图。不利于SEO优化。那么如何将TAGS静态化呢?(即改成//www.yii666.net/tags/1.html)。 这里主要是通过修改调用的标签进行伪静态。

    2024年02月02日
    浏览(37)
  • 基于Sane成功解决路由器改OpenWrt打印扫描服务器的手机移动端(IOS、Android)扫描功能实现问题

    家里有一台HP打印扫描一体机HP DJ 2300 series PCL-3,不具备打印和扫描功能。之后买了一个TPlink的wr703n路由器,刷了OpenWrt系统,安装p910nd,通过9100端口的方式实现了无线打印(具体看我写的这篇:TP-LINK-TL-WR703N(原装)制作打印服务器过程记录整理)。但在后期的使用过程中,

    2024年02月06日
    浏览(69)
  • DedeCMS系统TAG标签和分页伪静态设置教程的实现

    现在好多CMS系统都有TAGS标签这项功能,知名的DEDECMS也有,但是它的标签功能很差,不利于seo优化,同时也有很多问题,比如:当前页不存在上一页时,链接为“-1”的问题,还有出现“系统无此标签,可能已经移除”的问题。 今天小编就教大家把标签伪静态(部分资料来源

    2024年02月02日
    浏览(67)
  • vue后台项目左侧菜单栏配合element-ui中tag标签实现多标签页导航栏

    效果图 第一步:设置左侧菜单栏 左侧菜单栏,左侧菜单我这边自定义写死的数据。 分为有子菜单和没子菜单等情况,我用到的只有俩种,没有三级菜单。 HTML部分

    2024年02月11日
    浏览(39)
  • iOS开发 - 系统自带框架实现扫一扫功能

    iOS 扫一扫 利用系统自带框架实现扫一扫功能 扫一扫功能相机和相册权限,在info.plist中设置询问用户是否允许访问的权限。 info.plist加入NSCameraUsageDescription、NSPhotoLibraryUsageDescription、NSPhotoLibraryAddUsageDescription 当每次进入扫一扫页面时,需要判断是否开启了权限 AVCaptureDevice:

    2024年02月15日
    浏览(31)
  • 鸿蒙智联:NFC标签

    NFC标签碰一碰功能可以实现设备的快速连接和配网,无需扫描、选择设备、输入密码等繁琐操作,为用户提供便捷的设备交互体验;为了确保设备NFC标签的可用性和可靠性,伙伴需要按照指定的要求生成NFC标签样品,并提交验收测试。验收测试通过之后,才能用于商用生产。

    2024年02月12日
    浏览(36)
  • NFC无源标签协议

    无源NFC接口基于 ISO/IEC 14443-3 A 类标准; 命令+起始地址+结束地址+数据 = 1+1+1+64 = 67字节,每次写入的命令和地址都是一样的; 第一包数据必须发送该字符串数据\\\" picksmartM=1H=128W=296S=1C=1 \\\",否则不会处理后面的数据; 因为每一包的数据必须发满64字节,而第一包字符串数据不够6

    2024年02月07日
    浏览(29)
  • iOS开发 - 检测晃动/摇一摇功能UIAccelerometer与motion实现

    iOS检测晃动/摇一摇功能实现 app开发中,要实现检测晃动/摇一摇功能,下面记录下两种方案

    2024年02月16日
    浏览(23)
  • Android NFC 读取卡片信息

    因为朋友需要个读取NFC卡片数据的功能,所以最近看了一下Android 系统下NFC 读取卡片信息的操作. NFC(近距离无线通信 ) 是一组近距离无线技术,通常只有在距离不超过 4 厘米时才能启动连接.借助 NFC,您可以在 NFC 标签与 Android 设备之间或者两台 Android 设备之间共享小型负载。

    2024年02月11日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包