iOS UWB——Neaby Interaction框架(一)

news2024/11/26 3:24:24

苹果自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.framework
    mpcSession.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 call
    the -[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.coloradmin.cn/o/1049434.html

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

相关文章

Sketch mac98.3(ui设计矢量绘图)

Sketch Mac是一款矢量绘图软件,适用于UI设计、网页设计、图标制作等领域。以下是Sketch Mac的一些主要特点: 简单易用的界面设计:Sketch Mac的用户界面简洁明了,使得用户可以轻松上手操作,不需要复杂的学习过程。强大…

安全学习_开发相关_Java第三方组件Log4jFastJSON及相关安全问题简介

文章目录 JNDI:(见图) Java-三方组件-Log4J&JNDILog4J:Log4j-组件安全复现使用Log4j Java-三方组件-FastJsonFastJson:Fastjson-组件安全复现对象转Json(带类型)Json转对象Fastjson漏洞复现(大佬文章 JNDI:(见图) …

单目标应用:基于螳螂搜索算法(Mantis Search Algorithm,MSA)的微电网优化调度MATLAB

一、螳螂搜索算法 螳螂搜索算法(Mantis Search Algorithm,MSA)由Mohamed Abdel-Basset等人于2023年提出,该算法模拟螳螂独特的狩猎和性同类相食行为。MSA由三个优化阶段组成,包括寻找猎物(探索&#xff09…

京东数据挖掘:2023年8月京东厨卫大电行业数据分析

8月份,厨卫大电市场的销售数据已经出炉。鲸参谋数据显示,今年8月份,京东平台厨卫大电的销量为197万,同比增长9%;销售额将近33亿,同比增长约14%。整体来看,厨卫大电市场在逐步复苏,与…

SVM(上):如何用一根棍子将蓝红两色球分开?

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

编写Android.mk / Android.bp 引用三方 jar 包,aar包,so 库

一.前言 在Android10之后,所有项目工程中,官方推荐使用Android.bp去编译构建,以前使用Android.mk构建的项目随着版本迭代升级,慢慢需要变更为Android.bp, 两者的语法都需要去了解并熟练使用。 笔者之前写过Android.mk的…

模拟实现C语言中经典库函数,字符相关的函数与内存相关的函数

前言:C语言中拥有非常多的库函数,仅仅知道它们是不够的,在知道它们的原理后,去模拟实现它能够帮助我们更好的掌握这些库函数。 PS(在面试时,部分企业会让你来模拟实现一些库函数) 文章目录:模拟库函数的实现…

专栏更新情况:华为流程、产品经理、战略管理、IPD

目录 前言 01 华为流程体系入门课 CSDN学院 02 产品经理进阶课 CSDN学院 03 BLM 战略方法论进阶课 04 IPD 进阶 100 例专栏 作者简介 前言 已上线四大课程专栏更新情况: 01 华为流程体系入门课(视频图文); 02 硬件产品经…

C++——list(2)

作者:几冬雪来 时间:2023年9月28日 内容:C——list内容讲解 目录 前言: list的const迭代器: const的iterator: const迭代器: operator->: 拷贝构造: 迭代器接口补充&…

LayoutLMv2:多模态预训练用于富含视觉元素的文档理解【论文翻译】

文章目录 基础信息摘要1 Introduction2 Approach2.1 Model Architecture2.2 2.2 Pre-training TasksMasked Visual-Language ModelingText-Image Alignment (对齐)Text-Image Matching(匹配) 3 Experiments3.1 Data 3.2 SettingsPre-training LayoutLMv2Fine-tuning LayoutLMv2…

初探802.11协议(5)——MIMO/MU-MIMO/OFDMA概念介绍

目录 一. MIMO 1.1 从SISO到MIMO 1.1.1 SISO 1.1.2 SIMO 1.1.3 MISO 1.1.4 MIMO 1.2 MIMO类型 1.3 Wi-Fi MIMO 1.3.1 空间分集 1.3.2 空分复用 二. 从MIMO到MU-MIMO 三. OFDM到OFDMA 四. MU-MIMO vs OFDMA REF 一. MIMO 空间流 (Spatial Stream) :传…

一个简单的敏捷开发的例子

敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视…

【数据库】存储引擎InnoDB、MyISAM、关系型数据库和非关系型数据库、如何执行一条SQL等重点知识汇总

目录 存储引擎InnoDB、MyISAM的适用场景 关系型和非关系型数据库的区别 MySQL如何执行一条SQL的 存储引擎InnoDB、MyISAM的适用场景 InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎。实现了四个标准的隔…

Spring事务不生效的场景的解决方案

一、前言 在Java Web开发中,使用Spring框架可以大大简化开发人员的工作。其中,事务管理是Spring框架中的一个重要功能,它可以确保多个数据库操作要么全部成功,要么全部失败。但是,在实际开发中,我们可能会…

【SQLServer语句按月记录总数量】

情景描述:如下表Table_Name有id,name,CreatedDate三个字段.现在需要按照月份记录总数量,得到一个包含月份,数量的表。 select MONTH(CreatedDate) as 月份, COUNT(*) as 数量 from Table_Name group by MONTH(CreatedDate) order by month(C…

JVM调优实战及常量池详解

阿里巴巴Arthas详解 Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://alibaba.github.io/arthas Arthas…

前端uniapp防止页面整体滑动页面顶部以上,设置固定想要固定区域宽高

解决:设置固定想要固定区域宽高 目录 未改前图未改样式改后图改后样式 未改前图 未改样式 .main {display: flex;flex-direction: row;// justify-content: space-between;width: 100vw;// 防止全部移动到上面位置!!!&#xff01…

排序:堆排序算法分析以及插入删除操作

堆排序可以看作顺序存储的完全二叉树。 堆排序属于选择排序的一种, 选择排序:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列。 1.堆的定义 若n个关键字序列 L [ 1... n ] L[ 1...n] L[1...n]满足下面某一条性质,则称为堆…

【Vue】监控路由与路由参数, 刷新当前页面数据的几种方法

目录 一、Vue监控路由 1、Vue中watch监控路由 2、Vue中watch监控路由的某一个参数 3、Vue中watch同时监控多个路由 二、刷新当前页面数据 1、location.reload 2、$router.go(0) 3、this.$router.resolve()与this.$router.resolve() a、this.$router.resolve() b、thi…

leetcode1610. 可见点的最大数目(java)

可见点的最大数目 题目描述滑动窗口 题目描述 难度 - 困难 leetcode1610. 可见点的最大数目 给你一个点数组 points 和一个表示角度的整数 angle ,你的位置是 location ,其中 location [posx, posy] 且 points[i] [xi, yi] 都表示 X-Y 平面上的整数坐标…