大多数浏览器和
Developer App 均支持流媒体播放。
-
Core NFC 增强功能
了解在您的 app 中添加 NFC 支持有多简单,以及利用 NDEF 写入和支持广泛采用的原生标记协议等最新功能有多容易。
资源
相关视频
WWDC20
Tech Talks
WWDC17
-
下载
(关于Core NFC的改进)
大家好 欢迎参加 关于Core NFC的改进演讲 我希望今年大家都能度过一个 愉快的WWDC 我希望每个人都在昨天的盛典上 度过了一段愉快的时光 我是Gordon 我是Apple NFC 软件团队的一员 稍后我们的另一位团队成员 Lawrence会加入我 现在让我们谈谈NFC
(API变更) 两年前 我们引入了Core NFC框架 用于在app内 启用NDEF标签读取 去年我们引入了后台标签扫描 用于支持自动发觉NDEF标签 和app启动 然而自从… 自从我们发布了 Core NFC框架之后 开发人员们一直都在请求一件事 在这里 在Apple 我们听取了你们的要求 今年我们要超级激动地发布 我们支持NDEF标签读取 和本地标签访问 是的 谢谢
app不仅可以读写 NDEF格式的标签 你还可以使用标签的本地协议 与之进行交互 这极大地影响了你在app内 可以使用NFC实现的功能 比如你可以读取passports 与智能卡通讯 并与NFC硬件进行交互 这些在iPhone 7 及其之后版本的手机上可用
在我们了解API变更之后 我们要看一下如何在app内 写入NDEF标签
然后我们就深入了解 如何使用本地标签访问
最后我们做一个演示 在实际操作中展示我们所讲述的内容
先让我们看一下新API变更
快速回顾一下 Core NFC框架的基本结构 保持不变 app将从框架中 检索阅读器会话对象 然后当会话激活后 你就可以自由地实施NFC操作
每次当阅读器会话被激活时 屏幕上仍将显示标签读取动作表单
新的标签读取和本地标签访问功能 对你的app都可用 然而后台标签扫描功能 仍要求是NDEF格式的标签 并且为只读
同时 现有的60秒最大扫描时间 仍存在于每个阅读器会话中
(阅读器会话) 有什么新功能? 今年有一个新NFC标签阅读器会话 可以让app扫描并连接到标签 基于它们的基础技术
它还允许你停止并重启轮询周期 从而发现新标签 或如果需要的话可以重新连接
同时我们修改了 NFCNDEFReaderSession 让它也支持标签写入 这两个会话将为app 提供NFC标签对象 可以让在与标签进行交互时 使用新标签接口
这是Core NFC中的 新标签协议 你可以看到它列出了所有 主要类型的协议 NDEF、ISO7816、MIFARE、 ISO15693和FeliCa 如果你不熟悉NFC技术 我建议你首先了解NDEF
(一般API用法) 让我们回顾一下 在Core NFC中 使用这些新功能的基本步骤
首先你需要在Xcode中启动权利 和之前一样
这是一个启动了 NFC功能的app示例 执行此操作不需要特殊权限
你可以在这里看到有两种不同功能 第一是NDEF 另一个是本地标签访问 (Xcode配置) (一般API用法) 接下来你要决定你的app需要什么 NDEF或本地访问 并使用适当的阅读器会话
你需要实施新协议委托回调 来接收新标签对象
一旦你有了标签对象 你要使用阅读器会话连接到标签
那时你就可以自由地使用标签对象 实施全部交互了
最后当你完成后 使会话无效并释放标签
(NDEF标签写入) 好吧 我之前提到过 如果你刚接触NFC 先了解一下 NFC数据交换模式或叫做NDEF 它是向app中添加NFC功能 最简单的方式
新标签运行支持 允许使用任意NDEF格式的标签 进行快速实施和原型设计 无论它是什么类型
举个例子NDEF标签可以采用 与二维码相同的方式使用 可以轻松地集成到许多现有用例中
要更进一步 在NFC中使用新标签写入支持 你可以直接从iOS中 创建与后台标签扫描 相兼容的NFC标签
让我们看一下 是的 谢谢
让我们仔细看看 在app中写入 NDEF标签是多么简单
正如我所说过的那样 你需要使用 NFCNDEFReaderSession 并且你需要实施 新didDetect标签回调方法 用于接收NDEF标签对象
这将允许app做各种事 比如查询关于标签的 NDEF相关信息 包括它的最大容量 并决定标签是否可写入
你还可以读取NDEF信息 写入NDEF信息 如果标签支持 你甚至可以锁定标签 从而不能再重写标签
让我们看一些代码
要开始写入NDEF标签 我们要实例化我们的 NFCNDEFReaderSession 我们提供我们的新委托 并且把invalidateAfterFirstRead 参数设为假
接下来当发现标签后 我们将在这里的新 Delegate回调方法中收到它
一旦我们有标签之后 我们可以把它发送到阅读器会话的 Connect方法 从而连接到标签 此时 你的标签将保持连接 直到你连接到不同的标签 重启轮询 或使会话无效
下一步是在我们连接到标签之后 查询NDEF信息 如果标签返回一个读写状态 我们就可以自由地把新信息写入标签
下一步是使用我们的有效载荷 创建NFC NDEF信息 并把它发送到标签的 writeNDEF方法更新标签
最后当我们都完成后 调用Invalidate方法 这会终止全部NFC操作并结束会话
就是这样 很简单 对吧? 这是在app内写入NDEF标签 所需要的全部步骤
可能有一些用例 你需要使用非NDEF格式的标签 进行交互 为此 我们需要使用本地标签访问 让我们具体看一下
(本地标签读取 ISO7816) 让我们先看ISO7816 ISO7816接口用于 A类型和B类型NFC标签
用于各种不同的用例 包括电子IDS 如passports、访问权限、 与智能卡通讯、付款和运输系统
支持7816的标签 利用app协议数据单元接口 通常缩写为APDU app可以使用7816标签对象 发送和接收APDU命令
与7816标签进行交互 有一些特殊要求 在我们查看代码之前 先回顾一下这些特殊要求
首先app需要向它的 info.plist文件中添加一条记录 声明具体的app标识符或AIDs 这个标识符是app打算要使用的 标识符
接下来一旦Core NFC 检测到标签 它首先会检查该标签是否支持 你在app的info.plist 文件中列出的其中一个AID 它将轮流选择每个AID 直到找到匹配为止
那时将调用Delegate回调 并且你将收到预先选择了 该AID的标签对象
然而此时 你可以自由地选择 在info.plist文件中 列出的任意其它AID
对于Core NFC中的 这些新功能 我们感到非常激动 然而 我们暂时不支持读取支付卡
这是app的info.plist 文件的一个示例 列出了它打算使用的AIDs
在这里你可以看到app列出了 用于进行NDEF操作的AID (ISO7816 AID列表)
现在我们要看一下实际的 7816标签对象
协议有特定于7816技术的属性
你可以看到这里的参数包含 唯一标识符 和历史字节
有人对这里的唯一ID感到激动吗? 这是我们所收到的第二个 最受欢迎的请求
还有个sendCommand方法 用于把任意形式的APDU 传输到标签并接收响应
要开始扫描7816标签 正如我所提到的那样 我们要做的第一件事是 实施遵守NFCTagReaderSession 委托协议的委托对象 只有三个必需方法 你可以在这里看到它们
要开始扫描7816标签 先实例化NFCTagReaderSession对象 把它提供给委托 并把轮询操作 设置为ISO14443 这是A类型和B类型标签的 基础NFC技术
接下来当Core NFC发现 有相匹配的AID的标签时 我们会在Delegate回调中 收到标签
一旦我们确信我们有7816标签 我们就使用阅读器的session.connect 方法连接到标签
最后当我们连接成功后 使用helper类 创建一个APDU 并使用与标签相同的命令方法 传输APDU 并接收其响应
在处理过程中 我们可能会发现与app相关的报错 我们不应该再继续 举个例子 假如我们正在尝试 读取一个passport 并且看起来我们没有合适的证书 或密码计算错误 在这样的情境中 我们非常希望向用户指出这个错误
用报错信息调用 Invalidate方法 将使会话无效 并会在动作表单UI上显示错误符号 以及所提供的错误信息 而不是显示对勾
这是出错指示的一个示例 我们稍后再在演示中具体看一下 但这非常棒 对吗? 这是我们所收到的第三个 请求最多的功能
这是一个现有的成功指示 以供参考
(本地标签读取 MIFARE) 那么这就是7816 让我们继续讲第二个技术 MIFARE MIFARE技术类似于7816 它基于NFC A类型标签
MIFARE是由 NXP定义的一个技术 在世界各地的票务和徽章系统中 大量使用
NFC MIFARE标签协议 属性与7816相似 此外还有另外一个 MIFARE家族属性 这将指出 所发现的特定MIFARE标签类型 可以是MIFARE Ultraligh、 MIFARE Plus或DESFire 目前不支持 MIFARE Classic标签
这里还有一个用于 发送任意MIFARE命令的方法
此外还有一个便利的方法 用于为标签发送7816 APDU 比如DESFire和Plus 标签将支持它们
现在让我们在实际操作中看一下
要开始扫描MIFARE标签 再一次 先实例化标签阅读器会话 把轮询选项设置为ISO14443 然后设置Delegate 和CallBegin
请注意MIFARE标签 支持7816接口 并包含在app的info.plist 文件中列出的一个AID 那会作为7816对象返回 而不是MIFARE对象
此时 当调用回调时 我们要进行特别检查以确保给我们 返回了一个MIFARE标签对象
一旦我们确保我们有 MIFARE标签对象 我们就把它发送到阅读器的 session.connect方法 并连接到标签
然后我们使用标签 发送MIFARE命令
(本地标签读取 IS015693) 好的 这是四种技术中的两种技术 让我们看一下ISO15693
这也叫做类型五或邻近标签 这些在零售、工业 甚至是医疗app中很常用
再一次 这个协议 有特定 于ISO15693技术的属性 在这里我们还有唯一标识符 以及制造代码和序列号
(ISO15693便利方法) 15693的命令集 如果你没见过的话 这个命令集非常大 协议有一些常见操作的便利方法 你可以在这里看到它们 包括读写单个或多个代码块、 锁定代码块、选择和重设
再一次 这里也有一个 用于发送任意自定义命令的方法 你可以按照ISO15693规范 构建任意命令 并使用那个方法来发送命令
你可以参考规范获取更多信息
(NFC标签阅读器会话) 要开始扫描邻近标签 现在每个人应该都很熟悉了
我们要创建NFCTagReaderSession 并把它提供给委托 但这一次我们把轮询选项 修改为ISO15693
当Core NFC发现一个 15693标签时 再一次 我们将在回调中收到标签
我们再一次验证 我们有适当的标签类型 然后使用sessions.connect 方法连接到标签
一旦连接成功 我们就使用标签 发布一条readSingleBlock命令
(本地标签读取 FELICA) 最后我们要讲第四种 也是最后一种技术FeliCa FeliCa是由Sony定义的 一种格式 在日本的运输和付款系统中广泛使用
FeliCa的使用 还有一些额外要求
与7816类似 app需要向info.plist 文件中添加一条记录 声明app打算要使用的具体的 FeliCa系统代码
出于安全和隐私考虑 我们要求是谨慎的 Felica系统代码 而不是通配符记录
(FeliCa要求) 类似于7816 当Core NFC 发现Felica标签时 我们首先验证… 检测该标签是否包含 在info.plist文件中 所列出的系统代码 如果包含 你将收到 标签和Delegate回调 如果不包含 将不会调用回调 并且app也不会收到 存在标签的通知
这是info.plist文件的 一个示例 注册FeliCa系统代码…
以执行NDEF操作
看一下这里的FeliCa标签协议 我们可以看到 专用于FeliCa的属性 我们有制造商ID 或简称IDM 以及当前所选择的系统代码 同时还有sendFeliCaCommand方法 用于把FeliCa命令发送到标签
(NFC FELICA 标签便利方法) 并且这个协议还有一些便利方法 用于执行一些常见的 FeliCa操作
你可以参考Sony的 FeliCa命令规范 获取更多信息
(NFC标签阅读器会话) 接着是我们现在应该都很熟悉的 使用模式 实例化 NFCTagReaderSession 并把它提供给委托 这一次把轮询选项 修改为ISO18092 这是Felica的NFC技术
一旦Core NFC发现一个标签 并找到与之相匹配的系统代码 我们会再一次在同样的委托中 接收标签对象
我们确保拥有我们所期待的合适的 标签类型 然后连接到标签
最后我们使用标签 发送requestResponse方法 我们现在已经讲了使用四种本地技术 写入NDEF标签和与标签相交互
现在我想邀请 Lawrence上台来 给我们做一个演示
好吧 谢谢Gordon 大家好 欢迎参加我们的演讲
为了在现实示例中演示 如何使用Core NFC框架 让我带你想象一下鱼贩的生活
作为一个技术精通的鱼贩 我听说NFC技术 可以改善客户契合度 同时也可用于存货管理
在听了这场很棒的演讲之后 我决定创建两个app改善我的买卖 即Great Fish公司
我要以两种方式使用NFC
首先我要创建 NFC NDEF标签 来描述我的产品
第二 使用 MIFARE Ultralight标签 创建优惠码标签 这也叫做 NFC Type II标签
这是我们如何配送产品的概述 在捕鱼后 我们集成NFC NDEF标签 来描述捕获
信息包含他们所捕获的鱼 鱼的名称和价格
然后这个标签就被贴到产品包装上 并最终配送给我们的客户
我要创建的第一个app叫做 Fish Tag Creator
看起来是这样的
一旦我在app中输入全部信息 我可以点击“写入标签”按钮 写入NDEF标签
Fish Tag Creator app 还可以让我创建 NFC优惠码进行促销
我使用 MIFARE Ultralight标签 存储特定的优惠码 并把它发送给我的客户们
在这里我可以从三个可能的优惠值中 选择其中一个写入 我要创建的第二个app叫做 Fish Tag Reader
我的客户可以从App Store 下载这款app 并读取他们所购产品上的 NDEF鱼标签
在第一个选项卡中 我们有“点击扫描”按钮 可以扫描鱼随附的鱼标签
然后app就显示它在标签中 所存储的信息 在第二个选项卡中 我们可以点击“扫描优惠码”按钮 用于读取MIFARE Ultralight鱼标签 优惠码标签 客户可以在将来购买时兑换此优惠码
现在让我们在实际操作中看一下 这两个app
好吧 我基本上…
把Fish Tag Reader app 把Creator app打开了
今天我带来了一条 创意彩虹鲑鱼
先选择今天日期和鱼的名称 鱼的名字叫做 Creative Salmon
好的 这条鱼显然很大 对吧
现在我要点击“写入标签”按钮
将显示动作表单 此时我可以把手机靠近NDEF标签
宾果
接下来我要给你们创建一个优惠标签
我要选择“创建优惠码”按钮
我要选择打五折 因为 你知道的 这是个特别的WWCC促销 对吧?
好吧 让我点击按钮 屏幕上再次显示动作表单 现在我用手机靠近优惠标签
瞧!
好的 现在我要切换到 NFC Tag Readers app
重新测试全部NFC标签
在这里我打开了app
我要按“扫描标签”按钮 并读取我的NDEF鱼标签
现在屏幕上显示了对于产品的描述
哇哦 很酷 好吧 现在我要试着扫描优惠码标签 我要选择第二个选项卡 点击“扫描优惠码”按钮
好吧 是的 这是鱼打五折的优惠码
好的 现在试着第二次读取优惠码
好的 这不是一个有效的优惠码
在实际操作中 了解了这两款app之后 我要切换到源代码中 看看这是如何实施的
好吧 让我们先看 “鱼标签创意供应”
在这里 我将在我的权利文件中 设置NDEF和本地标签功能 这是因为我要在我的app中 使用NDEF和标签读取… 阅读器会话
现在让我们看一下
主视图控制器 看看NDEF写入器是如何实施的
在…
抱歉 稍等
在WriteTagAction 函数中 我们要实例化 NFCNDEFReaderSession
设置警告信息
并调用Begin方法开始会话
当发现NDEF标签时 会把它发送到Delegate函数
我们连接到标签
并调用 queryNDEFStatus
如果标签可写入 并拥有足够的存储空间 我们就调用 writeNDEF函数写入标签
最后我们调用 invalidateFunction结束会话
现在让我们看看优惠码是如何创建的
在这里我们有 createCoupon动作函数
我们实例化 TagReaderSession对象
调用setAlert信息 并调用beginFunction 以开始会话
在这里我们在 Delegate函数中 特别查找MIFARE Ultralight 优惠码标签
当找到标签后 我们连接到它并启动写入操作
要写入标签 我们要创建一个优惠码 然后调用sendMIFARE命令 以开启写入操作
当完成所有写入操作之后
就使会话无效
我们既使用了NDEF 又使用了本地标签阅读器会话 来创建NFC标签 现在让我们一起看一下 Fish Tag Reader app
NFCTagReaderSession 有一些便利方法 用于实施NDEF操作
我们在这里使用了这些方法
然而它要求我们向info.plist 文件中对NDEF 添加7816 AID 和F类型系统代码 如这里所示
在扫描视图控制器中
我们有ScanTag动作函数
在这里我们创建一个 TagReaderSession
设置警告信息
和CallBegins 从而开始写入Reader动作函数
当找到NFC标签之后 就把标签提交到 Delegate回调中
我们连接到标签
并实施NDEF状态查询
如果标签可读取 就调用readNDEF方法
现在让我们… 最后我们实际上要通过调用 Invalidate使会话无效
现在让我们看一下如何读取 优惠码标签
在这里我们有一个 ScanCoupon动作函数 跟以前一样 我们实例化一个 NFCTagReaderSession对象
设置警告信息
通过调用Begin开始会话实现
当找到标签后 检查标签是否是 MIFARE Ultralight标签
如果是
我们就连接到标签
要读取标签 我们要调用 sendMIFARE命令
然后验证队列点
最后调用Invalidate 方法结束会话
如果优惠码无效
我们就调用 invalidateErrorMessage
这就是使用Core NFC框架 创建一款优秀的app所需要做的 一切操作 舞台交还给Gordon
谢谢Lawrence
我们希望新标签写入和本地访问 可以让你们向你们的app中 添加非常棒的新功能 如我们所见 非常直截了当并且非常简单 让我们快速回顾一下 我们今天所讲的内容 首先确定app要求哪种类型的 阅读器会话 NDEF、本地访问或两者都有
实施newDelegate方法 以接收新标签对象
一旦你拥有标签对象 使用这些对象实施全部读写操作
当你全部完成之后 使用合适的Invalidate 调用表明成功或指示错误
就这样
(要获取更多信息请访问 DEVELOPER.APPLE.COM/WWDC19/715) 今天我们所讲到的全部示例代码 全部在线可用 并附带其它信息 现在iOS 13和 Xcode 11都可用了 每个人都应该下载它们 并使用Core NFC 开始执行一些非常棒的新功能
如果你有任何疑问 本场演讲结束之后就有一场 Core NFC演讲
欢迎大家参加
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。