探索SiriKit与ARKit:提升应用交互与增强现实体验
1. SiriKit简介
SiriKit能让应用与Siri相连,使用户可以通过语音指令与应用进行交互。不过,SiriKit所能处理的领域范围有限,主要包括消息传递、乘车预订、VoIP通话或支付等。
1.1 支付模拟操作
当Siri询问是否要发送支付时,说“Send”,Siri会提示已发送支付,但实际上并未真正完成支付,因为还未编写代码来定义收款方或从账户中提取资金的方式。
1.2 自定义应用界面
虽然可以使用UILabel自定义MainInterface.storyboard,但也能轻松添加代表应用logo的图片或文本,这样用户就能在Siri中识别应用。
1.3 项目定制
- 模板代码处理 :创建项目的目标文件时,Xcode会生成用于消息传递领域发送消息的模板代码。若要将其用于其他领域(如照片或健身),需删除IntentHandler.swift文件中的大部分代码。
- Info.plist文件编辑 :编辑Extension和ExtensionUI文件夹中的Info.plist文件,定义应用将处理的特定领域意图,如INSendPaymentIntent或INSendMessageIntent。
- 用户界面定制 :若要在Siri中定制用户界面,需修改MainInterface.storyboard文件和IntentViewController.swift文件。
通过将SiriKit添加到应用中,借助Siri的自然语言处理能力,能让应用更易用。
2. ARKit基础
2.1 增强现实概念
增强现实(AR)是一种将虚拟对象叠加在实际物理对象上的技术。例如,热门游戏Pokemon Go通过iPhone相机将Pokemon角色叠加在实际场景中。AR的应用场景广泛,如指向街道可查看周边街道名称和商家名称,在大型公共场所(如机场候机楼或博物馆)提供带箭头的步行导航。
过去,创建AR应用需要编写数学方程来跟踪现实世界对象并定位虚拟对象。现在,苹果通过新的软件框架ARKit让创建AR应用变得更加容易,结合SceneKit等其他框架,能快速轻松地创建AR应用。需要注意的是,只能在iPhone 6s及以上机型或iPad Pro上测试和运行ARKit应用。
2.2 ARKit工作原理
ARKit通过识别周围的特征点来工作。当它识别出iOS设备相机所拍摄的物理对象后,就能将虚拟对象叠加在相机显示的真实图像上。
2.3 创建AR项目示例
- 创建项目 :创建一个新的iOS项目,选择“Augmented Reality App”项目模板,点击“Next”。
- 设置项目信息 :当Xcode询问项目名称时,输入“ARTest”,确保“Content Technology”弹出菜单显示“SceneKit”(SpriteKit适用于2D图像,Metal适用于喜欢自己编写代码创建图形的高级用户,大多数情况下建议使用SceneKit显示3D图像),然后点击“Finish”。此时,Xcode会创建一个标准的iOS项目,包含AppDelegate.swift文件、ViewController.swift文件和Main.storyboard用户界面。
3. AR项目代码分析
3.1 ViewController.swift文件
打开ViewController.swift文件,会看到以下关键代码:
import UIKit
import SceneKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
sceneView.showsStatistics = true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let configuration = ARWorldTrackingConfiguration()
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
sceneView.session.pause()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
- 导入框架 :导入UIKit用于创建iOS应用,SceneKit用于显示三维对象,ARKit用于为应用添加增强现实功能。
- 采用协议 :ViewController类采用ARSCNViewDelegate协议,该协议允许将SceneKit图像作为增强现实对象叠加在现实世界对象上。
- IBOutlet :ViewController.swift文件中包含一个名为sceneView的IBOutlet,点击Main.storyboard文件,可看到用户界面上已存在一个ARKit SceneKit View,用于在相机背景上显示3D SceneKit图像。
- 创建增强现实 :在viewWillAppear函数中,第一行代码创建一个名为configuration的常量,代表ARWorldTrackingConfiguration对象,用于跟踪iOS设备的方向和位置以及检测现实世界表面;第二行代码将增强现实图像叠加在相机显示的视图上。
- 显示统计信息 :在viewDidLoad函数中,设置sceneView.showsStatistics = true可在屏幕底部显示每秒帧数(fps)和计时数据。
3.2 虚拟对象文件
在Navigator面板中,可看到一个art.scnassets文件夹,展开后包含ship.scn和texture.png两个文件。ship.scn文件包含一个可修改外观的三维对象,texture.png文件包含应用在ship.scn形状上的图形。
- 文件格式转换 :.scn是SceneKit文件格式,大多数3D数字成像程序可保存为.dae(Digital Asset Exchange)文件格式。若将.dae文件添加到Xcode,可通过将其添加到Navigator面板,然后选择“File ➤ Export”并保存为.scn文件进行转换。若要创建.dae文件,可使用免费的开源软件Blender(www.blender.org),也可在互联网上找到免费的公共领域.dae文件。
3.3 虚拟对象外观修改
点击ship.scn文件,在Xcode窗口中点击平面图像,再点击“Show the Materials Inspector”图标(或选择“View ➤ Utilities ➤ Show the Materials Inspector”),可打开Materials Inspector面板,用于修改形状的外观。点击“Diffuse”弹出菜单,可看到当前选择的是texture.png文件,点击“Black”或“White”可移除纹理,观察移除纹理后ship.scn文件外观的变化。
3.4 运行AR项目
确保“Diffuse”弹出菜单再次显示texture.png,通过USB电缆将iOS设备连接到Mac,将iOS设备相机指向任意位置,ship.scn文件的虚拟图像应会叠加在相机拍摄的现实世界对象上。移动iOS设备时,可看到ship.scn图像的不同角度,屏幕底部会显示增强现实图像的统计信息(如fps)。在Xcode中,选择“Product ➤ Stop”或点击停止图标可停止ARTest项目的运行。通过添加不同的纹理文件或替换ship.scn文件,可在iOS设备相机中显示自定义图像。
4. 显示特征点和世界原点
修改ViewController.swift文件,注释掉定义ship.scn文件并加载场景的两行代码,添加以下代码以显示特征点和世界原点:
//let scene = SCNScene(named: "art.scnassets/ship.scn")!
//sceneView.scene = scene
sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
特征点以黄色小点显示,用于突出ARKit识别的表面区域;世界原点以x、y、z轴显示,x轴向右,y轴向上,z轴指向屏幕外朝向用户。ARKit在光线清晰、有多物体可见的条件下效果最佳,光线不佳或相机指向空白墙壁或地板会影响其识别表面区域的能力。
完整的viewDidLoad函数如下:
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
// Show statistics such as fps and timing information
sceneView.showsStatistics = true
// Create a new scene
//let scene = SCNScene(named: "art.scnassets/ship.scn")!
// Set the scene to the view
//sceneView.scene = scene
sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
}
运行修改后的ARTest项目,可看到原点和代表特征点的黄色小点。
5. 绘制增强现实对象
5.1 可用几何形状
除了使用自定义图像,还可显示简单的几何形状,如:
| 形状名称 | 描述 |
| ---- | ---- |
| SCNBox | 绘制一个盒子 |
| SCNCapsule | 绘制一个两端为半球形的圆柱体 |
| SCNCone | 绘制一个圆锥体 |
| SCNCylinder | 绘制一个圆柱体 |
| SCNFloor | 绘制一个可选择性反射场景的无限平面 |
| SCNPlane | 绘制一个特定宽度和高度的矩形平面 |
| SCNPyramid | 绘制一个金字塔 |
| SCNSphere | 绘制一个球体 |
| SCNTorus | 绘制一个环形物体 |
| SCNTube | 绘制一个中心有孔的圆柱体 |
5.2 定义几何形状
显示几何形状时,需要定义三个特征:
-
物理尺寸
:如高度和宽度。
-
外观
:如颜色。
-
相对于世界原点的位置
。
定义好对象的大小、外观和位置后,需要定义一个节点将其放置在相机显示的视图上。在ViewController.swift文件的现有viewDidLoad函数中,在sceneView.debugOptions行下方添加以下代码:
let node = SCNNode()
node.geometry = SCNPyramid(width: 0.1, height: 0.2, length: 0.1)
node.geometry?.firstMaterial?.diffuse.contents = UIColor.cyan
node.position = SCNVector3(0, -0.2, 0)
sceneView.scene.rootNode.addChildNode(node)
- 创建节点 :第一行代码创建一个节点,用于定义几何形状的出现位置。
- 定义形状 :第二行代码定义一个SCNPyramid,指定其宽度、高度和长度。
- 设置颜色 :第三行代码将形状的颜色设置为青色。
- 设置位置 :第四行代码定义金字塔相对于世界原点的位置,在本例中,金字塔的底部位于原点下方 -0.2 处。
- 添加节点 :第五行代码将节点添加到场景中,一个青色金字塔将出现在世界原点正下方。
可以尝试更改node.position的值以及金字塔的宽度、高度和长度,将金字塔的颜色从青色改为红色或黄色,或者选择其他形状(如SCNBox、SCNTub或SCNCone)进行实验。
graph LR
A[创建AR项目] --> B[设置项目信息]
B --> C[查看ViewController.swift文件]
C --> D[导入框架]
C --> E[采用协议]
C --> F[设置IBOutlet]
C --> G[创建增强现实配置]
C --> H[显示统计信息]
D --> I[UIKit创建iOS应用]
D --> J[SceneKit显示3D对象]
D --> K[ARKit添加增强现实功能]
G --> L[ARWorldTrackingConfiguration跟踪设备和检测表面]
G --> M[运行配置显示增强现实图像]
H --> N[显示fps和计时数据]
C --> O[修改虚拟对象外观]
O --> P[打开Materials Inspector面板]
P --> Q[修改Diffuse纹理]
C --> R[显示特征点和世界原点]
R --> S[添加debugOptions代码]
C --> T[绘制几何形状]
T --> U[定义节点和形状属性]
U --> V[设置颜色和位置]
U --> W[添加节点到场景]
6. 重置世界原点
6.1 问题描述
首次运行AR应用时,会将世界原点定义在iPhone或iPad的当前位置。后退几步,可在屏幕上看到原点,但在再次运行应用之前,世界原点将保持固定。
6.2 创建ARReset项目
创建一个新的Single View App项目,命名为“ARReset”。
6.3 修改ViewController.swift文件
在ViewController.swift文件中添加SceneKit和ARKit框架,修改ViewController类以采用ARSCNViewDelegate协议:
import SceneKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
let configuration = ARWorldTrackingConfiguration()
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
sceneView.showsStatistics = true
sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
sceneView.session.pause()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func resetAR(_ sender: UIButton) {
sceneView.session.pause()
sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}
}
6.4 修改Info.plist文件
点击Info.plist文件,添加“Privacy – Camera Usage Description”键,否则应用将无法访问相机,无法运行。
6.5 修改Main.storyboard文件
- 点击Main.storyboard文件,添加一个ARKit SceneKit View到用户界面。
- 将一个UIButton拖到ARKit SceneKit View下方的屏幕底部,使其宽度与视图一致,将按钮标题设置为“Reset”。
- 选择“Editor ➤ Resolve Auto Layout Issues ➤ Reset to Suggested Constraints”。
6.6 创建IBOutlet和IBAction
- 打开Assistant Editor,从ARSCNView Control-drag创建一个名为sceneView的IBOutlet。
- 从UIButton Control-drag创建一个名为resetAR的IBAction方法,并添加以下代码:
@IBAction func resetAR(_ sender: UIButton) {
sceneView.session.pause()
sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}
运行该应用,后退几步可看到世界原点显示在前方。移动到新位置,点击“Reset”按钮,再后退,此时世界原点应会重新定义在新位置。
7. 绘制自定义形状
若ARKit提供的常见几何形状(如圆柱体、圆锥体、金字塔、盒子和球体)无法满足需求,可通过定义起点并添加线条来创建自定义形状,这种方式创建的形状称为Bezier路径。
7.1 创建Bezier路径的步骤
- 定义Bezier路径 :创建一个BezierPath对象。
let path = UIBezierPath()
- 定义起点 :使用move方法定义绘制的起点。
path.move(to: CGPoint(x: 0, y: 0))
- 绘制线条 :使用addLine方法定义线条的终点。
path.addLine(to: CGPoint(x: 0.2, y: 0.2))
- 创建形状 :根据定义的Bezier路径线条创建一个SCNShape。
let shape = SCNShape(path: path, extrusionDepth: 0.1)
7.2 显示自定义形状
将自定义形状定义为一个节点,设置其颜色和位置,然后将节点添加到增强现实视图中:
let node = SCNNode()
node.geometry = shape
node.geometry?.firstMaterial?.diffuse.contents = UIColor.yellow
node.position = SCNVector3(0,0, -0.4)
sceneView.scene.rootNode.addChildNode(node)
7.3 修改ARReset项目
修改ARReset项目的ViewController.swift文件,使其完整内容如下:
import UIKit
import SceneKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
let configuration = ARWorldTrackingConfiguration()
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
sceneView.showsStatistics = true
sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: 0.2, y: 0.2))
path.addLine(to: CGPoint(x: 0.4, y: -0.2))
let shape = SCNShape(path: path, extrusionDepth: 0.1)
let node = SCNNode()
node.geometry = shape
node.geometry?.firstMaterial?.diffuse.contents = UIColor.yellow
node.position = SCNVector3(0,0, -0.4)
sceneView.scene.rootNode.addChildNode(node)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
sceneView.session.pause()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func resetAR(_ sender: UIButton) {
sceneView.session.pause()
sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}
}
在连接到Mac的iOS设备上运行修改后的ARReset项目,应会看到一个黄色三角形形状出现在世界原点之后。
graph LR
A[创建ARReset项目] --> B[修改ViewController.swift文件]
B --> C[添加框架和采用协议]
B --> D[设置配置和代理]
B --> E[显示统计和原点信息]
A --> F[修改Info.plist文件]
F --> G[添加相机使用描述]
A --> H[修改Main.storyboard文件]
H --> I[添加ARKit视图]
H --> J[添加重置按钮]
H --> K[设置约束]
A --> L[创建IBOutlet和IBAction]
L --> M[创建sceneView的IBOutlet]
L --> N[创建resetAR的IBAction]
N --> O[添加重置代码]
B --> P[绘制自定义形状]
P --> Q[创建Bezier路径]
Q --> R[定义起点]
Q --> S[绘制线条]
Q --> T[创建形状]
P --> U[定义节点和属性]
U --> V[设置颜色和位置]
U --> W[添加节点到场景]
通过以上步骤,我们可以深入了解SiriKit和ARKit的使用方法,创建出具有语音交互和增强现实功能的应用。无论是利用SiriKit提升应用的交互性,还是借助ARKit实现虚拟与现实的融合,都能为用户带来全新的体验。在实际开发中,可以根据具体需求进一步探索和优化这些技术,创造出更具创意和实用性的应用。
探索SiriKit与ARKit:提升应用交互与增强现实体验
8. 总结与拓展
在前面的内容中,我们详细介绍了SiriKit和ARKit的相关知识及操作方法。SiriKit让应用能够与Siri集成,实现语音交互,为用户提供了更加便捷的操作方式。而ARKit则开启了增强现实的大门,让开发者可以轻松创建出将虚拟对象与现实场景相结合的应用。
8.1 技术要点回顾
-
SiriKit
:
- 可处理有限领域,如消息传递、乘车预订、VoIP通话和支付等。
- 定制项目时需处理模板代码、编辑Info.plist文件和修改界面文件。
- 能通过自定义界面元素让应用在Siri中更易识别。
-
ARKit
:
- 基于识别特征点将虚拟对象叠加到现实场景。
- 创建AR项目有特定的步骤和配置要求。
- 可通过修改代码显示特征点、世界原点和不同的几何形状。
- 支持绘制自定义形状,通过Bezier路径实现。
8.2 进一步探索方向
- SiriKit :可以尝试在不同领域中更深入地应用SiriKit,例如开发更复杂的支付流程或消息处理逻辑。同时,优化语音交互的体验,让用户与应用的沟通更加自然流畅。
-
ARKit
:
- 探索更多的3D模型和纹理资源,丰富虚拟对象的外观。
- 研究如何在不同的光照和环境条件下优化ARKit的性能。
- 结合其他技术,如机器学习,实现更智能的增强现实应用,例如自动识别现实场景中的物体并做出相应的反应。
9. 应用案例分析
为了更好地理解SiriKit和ARKit的实际应用,下面我们分析一些具体的应用案例。
9.1 SiriKit应用案例
- 语音支付应用 :一些金融类应用集成了SiriKit的支付功能,用户可以通过语音指令完成转账、缴费等操作。例如,用户只需对Siri说“向张三转账500元”,应用就能自动完成支付流程,大大提高了支付的便捷性。
- 语音消息应用 :社交类应用利用SiriKit实现语音发送消息的功能。用户在不方便手动输入时,只需说出消息内容,Siri就能将其发送给指定的联系人,提升了消息传递的效率。
9.2 ARKit应用案例
- 室内装修应用 :一些家居类应用使用ARKit让用户在现实场景中预览家具的摆放效果。用户可以将手机摄像头对准房间,应用会在屏幕上显示虚拟的家具模型,用户可以调整家具的位置、大小和颜色,直观地感受装修后的效果。
- 教育类应用 :教育类AR应用通过ARKit将抽象的知识以3D模型的形式呈现给学生。例如,在学习地理知识时,学生可以通过手机摄像头查看地球的虚拟模型,了解不同地区的地理特征和地貌。
10. 开发注意事项
在使用SiriKit和ARKit进行开发时,需要注意以下几点。
10.1 SiriKit开发注意事项
- 权限管理 :确保应用在使用SiriKit的相关功能时,获得了用户的必要授权。例如,在进行支付操作时,需要明确告知用户支付的金额和对象,并获得用户的确认。
- 错误处理 :考虑到语音识别可能存在误差,需要在应用中添加完善的错误处理机制。当用户的语音指令无法被正确识别时,应用应该能够给出友好的提示,并引导用户重新输入。
10.2 ARKit开发注意事项
- 设备兼容性 :由于ARKit只能在特定的设备上运行,开发时需要确保应用的目标设备支持ARKit。同时,要考虑不同设备的性能差异,对应用进行优化,以保证在各种设备上都能有良好的体验。
- 光照和环境条件 :ARKit的性能受光照和环境条件的影响较大。在开发过程中,需要进行充分的测试,确保应用在不同的光照和环境下都能正常工作。例如,在光线较暗的环境中,可以提示用户调整光照条件。
11. 未来趋势展望
随着技术的不断发展,SiriKit和ARKit也将迎来更多的发展机遇和挑战。
11.1 SiriKit未来趋势
- 更广泛的领域支持 :未来SiriKit可能会支持更多的领域,如医疗、娱乐等。用户可以通过语音指令查询健康信息、预订电影票等。
- 更智能的语音交互 :借助人工智能和机器学习技术,SiriKit的语音识别和理解能力将不断提升,能够更好地理解用户的意图,提供更加个性化的服务。
11.2 ARKit未来趋势
- 与其他技术的融合 :ARKit可能会与虚拟现实(VR)、人工智能等技术深度融合,创造出更加沉浸式和智能化的体验。例如,结合人工智能实现虚拟对象的智能交互。
- 应用场景的拓展 :除了现有的游戏、教育和装修等领域,ARKit在工业设计、旅游、购物等领域的应用也将不断拓展。例如,在旅游中,用户可以通过AR应用了解景点的历史和文化信息。
12. 总结
通过对SiriKit和ARKit的学习和实践,我们可以看到这两项技术为应用开发带来了巨大的潜力。SiriKit让应用更加智能和便捷,而ARKit则为用户带来了全新的视觉和交互体验。
在开发过程中,我们需要掌握相关的技术要点,注意开发中的细节,并关注未来的发展趋势。通过不断地探索和创新,我们可以利用SiriKit和ARKit开发出更加优秀的应用,满足用户日益增长的需求。
| 技术 | 优势 | 应用场景 | 开发要点 |
|---|---|---|---|
| SiriKit | 实现语音交互,提升便捷性 | 支付、消息传递等 | 处理模板代码、权限管理、错误处理 |
| ARKit | 实现增强现实,融合虚拟与现实 | 游戏、教育、装修等 | 设备兼容性、光照和环境优化 |
graph LR
A[技术总结] --> B[SiriKit要点回顾]
A --> C[ARKit要点回顾]
B --> D[领域处理]
B --> E[项目定制]
B --> F[界面定制]
C --> G[工作原理]
C --> H[项目创建]
C --> I[对象显示]
C --> J[自定义形状]
A --> K[应用案例分析]
K --> L[SiriKit应用]
K --> M[ARKit应用]
L --> N[语音支付]
L --> O[语音消息]
M --> P[室内装修]
M --> Q[教育应用]
A --> R[开发注意事项]
R --> S[SiriKit注意]
R --> T[ARKit注意]
S --> U[权限管理]
S --> V[错误处理]
T --> W[设备兼容性]
T --> X[光照环境]
A --> Y[未来趋势展望]
Y --> Z[SiriKit趋势]
Y --> AA[ARKit趋势]
Z --> AB[领域拓展]
Z --> AC[智能交互]
AA --> AD[技术融合]
AA --> AE[场景拓展]
希望本文能够帮助开发者更好地理解和应用SiriKit和ARKit,为开发出更具创新性和实用性的应用提供参考。在不断变化的技术领域中,持续学习和实践是保持领先的关键。让我们一起探索这些技术的无限可能,为用户带来更加精彩的应用体验。
超级会员免费看
8

被折叠的 条评论
为什么被折叠?



