我想在一个专为iOS10 +设计的应用中包含ARKit,如果iOS版本<11,我会用SceneKit替换ARKit。
不幸的是,目前似乎无法做到这一点?
答案 0 :(得分:5)
根据您设定期望的方式,可以将SceneKit用作ARKit的“后备” - 特别是来自ARSCNView
。
你可以轻松做的是创建一个3D内容体验,当在支持ARKit的设备上运行时,通过AR显示“在现实世界中”,并且在完全虚拟设置中(即,在没有摄像头输入的情况下以3D渲染)在没有ARKit的情况下运行时。
注意: ARKit支持不仅仅是iOS 11的东西 - 您还需要一台A9设备。因此,您可能会考虑iOS 11上旧硬件的后备体验,而不仅仅是旧iOS版本。
为此,您需要能够在运行时换出视图类。这意味着不在故事板中创建ARSCNView
,而是在代码中初始化一个并将其添加到视图控制器的根视图中。
override func viewDidLoad() {
super.viewDidLoad()
let sceneView = ARSCNView(frame: view.bounds)
sceneView.scene = // ... set up your SceneKit scene ...
view.addSubview(sceneView)
}
一旦你做了类似的事情,你可以将关键部分包装在条件中,在可用时使用ARSCNView
,否则使用SCNView
。实际上,您可能想为此设置一个方便的功能......
var canUseARKit: Bool {
if #available(iOS 11.0, *) {
return ARWorldTrackingSessionConfiguration.isSupported
} else {
return false
}
}
然后您可以条件化您的视图设置:
override func viewDidLoad() {
super.viewDidLoad()
let sceneView: SCNView
if canUseARKit {
sceneView = ARSCNView(frame: view.bounds)
} else {
sceneView = SCNView(frame: view.bounds)
}
sceneView.scene = // ... set up your SceneKit scene ...
view.addSubview(sceneView)
}
当然,之后还有更多工作要做:
但除了这些问题之外,使用ARSCNView
中的SceneKit内容与使用SCNView
中的SceneKit内容没什么不同,因此对于你的应用程序/游戏的其余部分,你可以分享很多代码AR与非AR用户体验之间的资产。
答案 1 :(得分:3)
您可以使用以下语法有条件地选择包含功能:
if #available(iOS 11.0, *) {
// Use ARKit
} else {
// Use SceneKit
}
答案 2 :(得分:0)
与任何框架一样,ARKit存在于其存在的系统版本中,并且不存在于其他系统版本中。 ARKit存在于iOS 11中,而不是iOS 10或之前。 iOS 10用户永远不会使用ARKit(无需升级到iOS 11)。
(即使这样,ARKit也只能用于运行iOS 11的设备子集,因为它的功能高度依赖于硬件。)