Justin, I totally understand what you are saying about the Simulator because it has a whole slew of problems associated with Sound errors and others as well.
But ... when my Nimbus+ is connected, the Nimbus' Buttons and Joysticks work as I have coded them ... and when it is not connected, nothing works as you would expect. So, so far everything is good.
Nimbus+ on, Buttons and Joysticks work ... Nimbus off, they do not work. Simple and very good!
Two challenges:
(1) if the Nimbus+ is off when I initially Run my App, Apple's code still registers the Nimbus+ as connected. In short, the @objc func disconnectControllers() doesn't get called.
(2) if the Nimbus+ is on and the Game is running as it should, and then I press the Home Button of the Nimbus+ to turn it off, once again @objc func disconnectControllers() is not called.
A significant update =
Initially I had all the Game Controller code in my GameScene = SKScene, with the call to ObserveForGameControllers within the SKScene's didMove and all I have reported happens.
Then, I spent a bunch of time moving all the Game Controller code to my GameViewController = UIViewController, with the call to ObserveForGameControllers now moved to its viewDidLoad().
Conceptually I believe the Game Controller code properly belongs as part of a ViewController and not a UIView because, again conceptually, the Game Controller controls all Scenes, not just one Scene.
Anyway, now the Game Controller code in GameViewController, including Apple's func setupControllerControls(...). The latter calls Apple's func controllerInputDetected(...)which is also moved to my GameViewController. This last funccalls a whole slew of funds located in my GameScene... like pressing "Y" to move a Game Piece "up".
All the Buttons and Joysticks work great when the Nimbus+ is on and don't work when the Nimbus+ is off ... identical to when my Game Controller Code was part of my GameScene = SKScene.
But the problems of turning off the Nimbus+ before App is run and while the App is running remain .