在iOS10中replaceARKit

如果iOS版本<11,我想将ARKit包含在为iOS10 +devise的应用程序中,在那里我用SceneKitreplaceARKit。

不幸的是,似乎目前没有办法做到这一点?

您可以使用以下语法有条件地select包含function:

if #available(iOS 11.0, *) { // Use ARKit } else { // Use SceneKit } 

根据您设定的期望,可以使用SceneKit作为ARKit的“后备” – 具体来说,可以使用ARSCNView

您可以轻松地做的就是创build一个3D内容体验,当在支持ARKit的设备上运行时,通过AR出现在“现实世界”中,并且在完全虚拟的设置中(即,在没有摄像头馈送的情况下以3D渲染)没有ARKit运行。

注意: ARKit支持不仅仅是一个iOS 11的东西 – 你还需要一个A9设备。 所以你可能会考虑iOS 11旧硬件的回退体验,而不仅仅是老版本的iOS。

要做到这一点,你需要能够在运行时换出你的视图类。 这意味着不要在故事板中创buildARSCNView ,而是初始化一个,并将其添加到代码中的视图控制器的根视图中。

 override func viewDidLoad() { super.viewDidLoad() let sceneView = ARSCNView(frame: view.bounds) sceneView.scene = // ... set up your SceneKit scene ... view.addSubview(sceneView) } 

一旦你做了这样的事情,你可以将关键部分包装在一个条件,使用ARSCNView时可用和SCNView否则。 其实,你可能想为此设置一个方便的function…

 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) } 

当然,还有更多的事情要做:

  • 当你使用ARKit时,你可以免费获得相机控制。 当你自己使用SceneKit时,你将不得不考虑在哪里放置相机,以及如何让用户控制它。 (查看WWDC17 SceneKit会话,了解有关新的iOS 11相机控件的一些提示。)
  • 当您单独使用SceneKit时,您的3D内容定义了用户与之交互的“世界” – 也就是说,您将相机等与您的内容相关联。 当使用ARKit时,您必须考虑在何处以及如何将您的内容放置到现实世界中。

但除此之外,在ARSCNView使用SceneKit内容与在ARSCNView使用SceneKit内容没有什么不同,因此对于其他应用程序/游戏,您可以在AR和非AR用户体验之间共享大量代码和资产。

像任何框架一样,ARKit存在于它所在的系统版本中,而不存在于其他系统版本中。 ARKit存在于iOS 11中,不在iOS 10或之前。 iOS 10用户不能使用ARKit(不升级到iOS 11)。

(即使如此,ARKit只能在运行iOS 11的设备的一个子集上使用,因为它的function依赖于硬件。)