This doesn't seem to give the actual MTU size but rather simply returns the max value it could possibly be which is 512. I have tested this with a variety of MTU values set on my peripheral and iOS always returns 512 for this value. The only way I was able to get the actual MTU size in my iOS app was to add a read characteristic to my BLE protocol that is the MTU size and then on my peripheral, when it gets the onMtuChanged callback, set the negotiated MTU value on the MTU read characteristic. Then in iOS, before I need to know the MTU size, I read this characteristic and get the actual MTU value. This gives me a correct value for the MTU.
I think this is a ridiculous solution/hack since CoreBluetooth is obviously getting the onMtuChanged callback just not making it available to the delegate. What's the point of a delegate if you don't give it all the information?!?!