Apple is deprecating OpenGL ES in the near future from iOS, tvOS and even MacOS X. We are supposed to use Metal instead. Yet both SpriteKit and SceneKit are broken and buggy when it comes to Metal support.
As an example, an SKTransition will take a screenshot of the source and target scenes and eg. fade between them. The problem? If you enable Metal, these screenshots will be shown upside down. (With OpenGL they look just fine.)
Dealing with shaders, especially when it comes to SceneKit materials, is a nightmare. Supposedly SceneKit transparently detects and translates glsl shaders to the Metal equivalent, but this functionality is buggy. This cross-compiler seems to be buggy and very nitpicky about syntax, and doesn't support glsl 100%. The worst part is that if compiling the shader at runtime fails, there's absolutely no way of knowing where the problem might be because Xcode outputs absolutely nothing. No error message, no logs, nothing. (If there is a way to make it output an error log message, I haven't found it.) The only way to know that your shader failed to compile is that it isn't working on screen. Essentially you would need to hunt the problem completely blindly.
"Well, just write the shader directly using Metal syntax, then." Except that it's still possible that your app will be run using OpenGL (eg. on the simulator, and possibly on older devices), and there's no way of distinguishing at runtime between the two. Obviously if you try to compile a Metal shader that uses something that glsl doesn't support (which is pretty inevitable), it will once again fail, and your shader won't work, breaking the game.
The only way to make sure that your game will run properly is to always force OpenGL. Which is being deprecated soon! Yet, if you try to support Metal, chances are your game will be broken and not function correctly, because of the poor support in both SpriteKit and SceneKit.
What exactly are we supposed to do?