swiftarkitarscnview

Swift ARKit How do you fully kill an ARSession?


I have an ARSCNView running an ARSession. You can pause the session with session.pause() sure, but that still in effect, leaves the session running. I have tried deallocating the ARSCNView by removing it from its superview. The ARSCNView indeed deallocates but the ARSession is still running afterwards!! You can't assign nil to ARSession either. I can see the ARSessionDelegate's

func session(_ session: ARSession, didUpdate frame: ARFrame) 

is still being called!

How do you completely wipe the slate clean with ARKit once you have finished with it?

Is it even possible?


Solution

  • Officially, right now, you can't.

    However, there is a work-around: you make the ARSCNView disposable.

    On leaving AR, first pause the ARSession. Then deallocate the entire ARSCNView hierarchy & set ARSCNView to nil for good measure. Rebuild the entire ARSCNView hierarchy and start a new session whenever you need to go back to AR.

    var ARview: ARSCNView?
    
    func punchTheClown() {
    
        ARView?.session.pause()
        ARView?.removeFromSuperview()
        ARView = nil
    
    }
    

    Other non-AR areas of your app would typically be in a separate view hierarchy at the same sibling level as your ARSCNView. I look forward to Apple providing an actual stopSession() function, so we can all stop having to punchTheClown in the meantime.