iOS UWB——Neaby Interaction框架(一)

苹果自2019年在iPhone中引入UWB技术,伴随着的就是其应用软件框架Nearby Interaction框架的升级。Nearby Interaction框架,是一个功能强大且易于使用的iOS空间感知能力。通过NI框架,支持开发者和配件制造商将对象检测和设备激活等功能整合到应用程序,更好的支持移动设备之间的互动。

开发者基于Apple U1芯片的UWB技术(最新一代的iPhone 15/15 Pro已经升级到U2芯片),基于NI功能实现“支持用户指向其他设备、查找朋友,并根据控件的距离和方向显示控制或其他UI”。

另外,从2021年1月苹果也宣布了基于UWB的数字汽车钥匙功能,该功能使车主可以更佳智能的实现车辆的管理。

在本文中,将对NI框架的基础内容,部分实现进行简要的介绍。

框架概述

在应用程序中使用Nearby Interaction来获取具有U1或超宽带(UWB)芯片的设备的位置,如iPhone11或更高版本的iPhone,Apple Watch和第三方配件。为了能够参与交互,物理接近的设备需要运行app,共享其位置和设备token以便能够唯一识别。当app在后台运行,Nearby Interaction通过报告等来通知交互会话对方的位置,基于方向和距离(米)。

Apple设备使用U1芯片的高频功能来共享其在物理环境中的位置,并实现流式传输的交互式会话。例如:

  • AR体验,放置虚拟水球放在参与者的手中;
  • 出租车或拼车应用程序,实时使用同行用户的方向来识别司机和乘客的相对位置;
  • 游戏应用程序,使用户能够使用他们的设备,控制球拍并响应等用户屏幕上的移动球。

Nearby Interaction为应用程序提供两种主要类型的输出:测量设备之间的距离,以及测量从一个设备到另一个设备的相对方向。因此,应用程序运行时,它能够获得包含距离和方向信息的连续更新流,该更新是双向的,会话的双方都在同时了解彼此的相对位置。

使用流程:
1)首先创建一个Nearby Interaction的会话对象,所有的Nearby Interaction都被封装在会话中。与其他的Apple框架类似,如ARKit,你可以为你的会话对象提供希望它运行的配置。因此,假设有两个或多个用户在运行您的应用程序,并且他们希望以某种空间方式相互交互。在此发生之前,您的应用程序需要让系统双方都知道如何识别附近的其他设备。
对等发现是一个关键概念。设备可以通过使用我们称为发现令牌的东西以保护隐私的方式相互发现。
发现令牌是在特定Nearby Interaction会话中为给定设备随机生成的标识符。
发现令牌有一个可以使用的有限时间段,并且该时间段与会话本身一样长,这意味着如果使会话无效或用户退出应用程序,任何会话机及其关联的令牌都会无效。
令牌由系统生成,通过会话对象在应用程序中接收它。创建的每个会话都有其自己唯一的关联发现令牌。最后,你的应用需要从会话对象中复制发现令牌,然后在想要交互的用户之间共享它。
发现令牌是符合NSSecureCoding协议,意味着可以轻松对其进行编码,然后使用应用程序可用的传输技术进行传输。
在这里插入图片描述
会话代码示例:

// Per-session Discovery Token
@available(iOS 14.0, *)
open class NIDiscoveryToken : NSObject, NSCopying, NSSecureCoding {
}// Encode discovery token
if let encodeData = try ? NSKeyedArchiver.archivedData(withRootObject: myDiscoveryToken, requiringSevureCoding: true){//Share encoded token using your app's networking layer,通过网络层共享token// EXAMPLE : using MultipeerConnectivity.frameworkmpcSession.send(encodeData, toPeers: [myPeer], with: .reliable)
}// 1.Session的创建示例
let session = NISession()// 2.set the session's delegate
session.delegate = self// 3. Share the discovery token with the peer device
let myDiscoveryToken = session.discoveryToken
// your app's method,应用中根据实际的情况,将token发送到相应的peer
sendDiscoveryTokenToMyPeer(peer, myDiscoveryToken) // Receive a discovery token from the peer device 
let peerDiscoveryToken = ...// 4. Create a session configuration,基于peer的DiscoveryToken
let config = NINearbyPeerConfiguration(peerToken: peerDiscoveryToken)// 5. Run your session
session.run(config)// 可以暂停会话
session.pause()// 可以恢复会话
session.run(session.configuration)

基本流程:
1、创建一个session,交换DiscoveryTokens。(测距双方交换Token)
2、基于Peer的Token创建一个NINearPeerConfiguration。
3、基于配置运行session(会话)。
会话只有当应用在前台运行时才处于活跃状态,恢复前等待sessionSuspensionEnded回调。
挂起的会话不会自动恢复。重新运行通过调用run(…)函数。
4、会话需要一个delegate(委托)来提供更新。运行之后,委托将开始获取有关附近对象的更新。
无效的会话将不能再被运行,这种情况下,需要创建新的会话,重新交换token。

外设实现

step.1 检测设备是否支持Apple U1芯片

var isSupported : Bool
if #available(iOS 16.0, watchOS 9.0, *) {isSupported = NISession.deviceCapabilities.supportsPreciseDistanceMeasurement
} else {isSupported = NISession.isSupported
}
if isSupported {// Initiate an interaction session.
}

注:在iOS16平台框架会调用不同的方法实现设备的支持检测,但是在实际的NI例程中框架在iOS16平台会报错提示没有deviceCapabilities对象,可能是官方文档已经更新但Xcode里框架的源代码还是旧版本,因此为避免报错可以将iOS16平台内的deviceCapabilities.supportsPreciseDistanceMeasurement方法也改用isSupported方法。(官方文档认为isSupported方法为弃用方法,但仍可用)

step.2 生成NIConfiguration类

配对流程
Nearby Interaction框架与配件设备进行配对连接的过程分为三步,

  • 第一步,通过双方设备共同接入的某种网络进行连接(与第三方配件设备框架推荐的方式是Bluetooth LE)。
  • 第二步,由配件设备通过选定的网络发送设备信息给框架。
  • 第三步,Nearby Interaction发送配置信息给配件设备。之后将开启UWB的测距会话。

具体流程图如下图所示。
外设配置流程

step.3 处理会话委托的回调函数

Nearby Interaction框架获取配对设备的距离、角度和设备信息通过NISessionDelegate协议与用户交互
NISessionDelegate协议
NISessionDelegate协议是Nearby Interaction框架与用户进行数据交互的的协议对象, 该协议要求委托类实现以下接口。


public protocol NISessionDelegate : NSObjectProtocol {/**This is called when new updates about nearby objects are available.@param session The nearby interaction session being run.@param nearbyObjects The nearby objects that have been updated.*/optional func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject])/**This is called when the system is no longer attempting to interact with some nearby objects.@discussion The system was unable to interact with a peer device for some time, or the peer device signaled that it is leaving the session. After this callback is received, the session with the peer is no longer active. To retry interacting with the peer, issue a new call to -runWithConfiguration:.@param session The nearby interaction session that removed the nearby object(s).@param nearbyObjects The nearby objects that were removed.@param reason The reason the nearby object(s) were removed.  All objects in nearbyObjects are removed for the same reason. If multiple nearby objects are removed for different reasons, -didRemoveNearbyObjects:reason: will be called multiple times.*/optional func session(_ session: NISession, didRemove nearbyObjects: [NINearbyObject], reason: NINearbyObject.RemovalReason)/**This is called when a session is suspended.@discussion A session will be suspended in various app and system scenarios.A suspended session may be run again only after -sessionSuspensionEnded: has been called.  Restart a session by issuing a new call to -runWithConfiguration:.@param session The nearby interaction session that was suspended.*/optional func sessionWasSuspended(_ session: NISession)/**This is called when a session may be resumed.@param session The nearby interaction session that was suspended.*/optional func sessionSuspensionEnded(_ session: NISession)/**This is called when a session is invalidated.@param session The session that has become invalid. Your app should discard any references it has to this session.@param error The error indicating the reason for invalidation of the session (see NIError.h).*/optional func session(_ session: NISession, didInvalidateWith error: Error)/**Provides configuration data that needs to be shared with the accessory.@note Shareable configuration data is only provided when running an NINearbyAccessoryConfiguration.@discussion After invoking this callback, the session will go into a special preparedness state for a limited amount of time.The interaction on the accessory must start within this time window. If activity is not detected from the accessory, the session will callthe -[session:didRemoveNearbyObjects:reason:] delegate callback. To restart the session, coordinate with the accessory and call -[runWithConfiguration] again.@param session The session which produced the configuration data.@param shareableConfigurationData The configuration data that needs to be shared with the accessory.@param object A representation of the accessory as a NINearbyObject. The discoveryToken property will be equal to the one in the configuration used to run the session.*/@available(iOS 15.0, *)optional func session(_ session: NISession, didGenerateShareableConfigurationData shareableConfigurationData: Data, for object: NINearbyObject)
}

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

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

相关文章

rust生命期

一、生命期是什么 生命期,又叫生存期,就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误,原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期,蓝色范围’b表示…

Koa处理请求数据

在开发中,后端接收到请求参数后,需要解析参数。请求分为很多种类型,比如常见的get和post。 请求参数 Koa本身可以解析get请求参数,不能解析post请求参数。例如: router.get(/api/get/userInfo, async (context) >…

计算机网络(四):网络层

参考引用 计算机网络微课堂-湖科大教书匠计算机网络(第7版)-谢希仁 1. 网络层概述 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输 要实现网络层任务,需要解决以下主要问题 网络层向运输层提供怎样的服务 (“…

Origin分段显示柱状图

注意这里生成的是柱状图,而不是直方图。因此用到的是plot -> column/bar/pie -> stacked column: 而不是Statistical->histogram。 先上最终的作图效果: 单个柱的柱状图 第一步先填充数据,如图左所示,然后选…

Android shape记录

之前一直觉得dataPath很好用&#xff0c;可以画各种矢量图。今天发现用shape画图也不错&#xff0c;记录一下自己用shape画的图。 一般使用shape就是定义形状、stroke边、solid内部、corners圆角等&#xff0c;代码 <?xml version "1.0" encoding "utf-8&q…

IntelliJ IDEA 常用快捷键

目录 一、IDEA 常用快捷键 1 通用型 2 提高编写速度 3 类结构、查找和查看源码 4 查找、替换与关闭 5 调整格式 二、Debug快捷键 三、查看快捷键 1、已知快捷键操作名&#xff0c;未知快捷键 2、已知快捷键&#xff0c;不知道对应的操作名 3、自定义快捷键 4、使用…

【python的输入】sys.stdin与sys.argv

在老师的课堂里碰到了sys.stdin与sys.argv&#xff0c;虽然是很简单的东西&#xff0c;还是花了大半天的时间才勉强理解。在这里记录一下学习过程&#xff0c;方便以后用到复习。 一、sys.stdin 根据python3 library里的解释&#xff0c; sys.stdin可用于所有交互式的输入。 …

音频编辑软件Steinberg SpectraLayers Pro mac中文软件介绍

Steinberg SpectraLayers Pro mac是一款专业的音频编辑软件&#xff0c;旨在帮助音频专业人士进行精细的音频编辑和声音处理。它提供了强大的频谱编辑功能&#xff0c;可以对音频文件进行深入的频谱分析和编辑。 Steinberg SpectraLayers Pro mac软件特点 1. 频谱编辑&#xff…

数据在内存中的存储(一个新手的理解)

目录 1.整数在内存中的存储 2.大小端字节序和字节序判断 2.1什么是大小端&#xff1f; 2.2为什么有大小端呢&#xff1f; 2.3那怎么知道编译器是什么存储呢&#xff1f; 2.4几个有趣的小练习 3.浮点数在内存中的存储 3.1练习 3.2浮点数的储存 3.2.1 浮点数存的过程…

【Java-LangChain:使用 ChatGPT API 搭建系统-4】评估输入-分类

第三章&#xff0c;评估输入-分类 如果您正在构建一个允许用户输入信息的系统&#xff0c;首先要确保人们在负责任地使用系统&#xff0c;以及他们没有试图以某种方式滥用系统&#xff0c;这是非常重要的。 在本章中&#xff0c;我们将介绍几种策略来实现这一目标。 我们将学习…

pytorch之nn.Conv1d详解

自然语言处理中一个句子序列&#xff0c;一维的&#xff0c;所以使用Conv1d

开启创意思维,畅享Mindomo Desktop for Mac思维导图之旅

在数字化时代&#xff0c;我们需要一个强大而直观的工具来整理和展现我们的思维。Mindomo Desktop for Mac&#xff08;Mindomo&#xff09;作为一款免费的思维导图软件&#xff0c;将为您提供卓越的创意思维体验。 Mindomo拥有直观的界面和丰富的功能&#xff0c;让您能够方便…

[React] Zustand状态管理库

文章目录 1.Zustand介绍2.创建一个store3.使用方法3.1 获取状态3.2 更新状态3.3 访问存储状态3.4 处理异步数据3.5 在状态中访问和存储数组3.6 持续状态 4.总结 1.Zustand介绍 状态管理一直是现代程序应用中的重要组成部分, Zustand使用 hooks 来管理状态无需样板代码。 更少…

JVM篇---第一篇

系列文章目录 文章目录 系列文章目录一、知识点汇总二、知识点详解:三、说说类加载与卸载一、知识点汇总 JVM是Java运行基础,面试时一定会遇到JVM的有关问题,内容相对集中,但对只是深度要求较高. 其中内存模型,类加载机制,GC是重点方面.性能调优部分更偏向应用,重点突出实践…

python二次开发CATIA:为选中元素上色

先打开一个零件文档&#xff0c;然后用鼠标选中元素&#xff0c;再运行如下python程序&#xff1a; import win32com.client import pywintypes # 导入pywintypes模块 import random # 启动CATIA应用 catia win32com.client.Dispatch(CATIA.Application) catia.visible1try:…

python中实现定时任务的几种方案

目录 while True: sleep()Timeloop库threading.Timersched模块schedule模块APScheduler框架Celery框架数据流工具Apache Airflow概述Airflow 核心概念Airflow 的架构 总结以下几种方案实现定时任务&#xff0c;可根据不同需求去使用不同方案。 while True: sleep() 利用whil…

【C++进阶(七)】仿函数深度剖析模板进阶讲解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 模板进阶 1. 前言2. 仿函数的概念3. 仿函数的实…

【GO 编程语言】面向对象

指针与结构体 文章目录 指针与结构体一、OOP 思想二、继承三、方法 一、OOP 思想 Go语言不是面向对象的语言&#xff0c;这里只是通过一些方法来模拟面向对象&#xff0c;从而更好的来理解面向对象思想 面向过程的思维模式 1.面向过程的思维模式是简单的线性思维&#xff0c;…

C#学生选课及成绩查询系统

一、项目背景 学生选课及成绩查询系统是一个学校不可缺少的部分&#xff0c;传统的人工管理档案的方式存在着很多的缺点&#xff0c;如&#xff1a;效率低、保密性差等&#xff0c;所以开发一套综合教务系统管理软件很有必要&#xff0c;它应该具有传统的手工管理所无法比拟的…

visual studio禁用qt-vsaddin插件更新

visual studio里qt-vsaddin插件默认是自动更新的&#xff0c;由于qt-vsaddin插件新版本的操作方式与老版本相差较大&#xff0c;且新版本不稳定&#xff0c;容易出Bug&#xff0c;所以需要禁用其自动更新&#xff0c;步骤如下&#xff1a;     点击VS2019菜单栏上的【扩展】–…