This is caused by the below line.
wheel.physicsBody.categoryBitMask = 3;
The SpriteKit compares the body's categoryBitMask to the other body's collisionBitMask by performing a logical AND operation. When the result is Non-Zero Value, the collision is fired.
In this case, SpriteKit compares wheel's categoryBitMask to player's collisionBitMask like below.
The wheel's categoryBitMask is 0x011 (= 3)
The player's collisionBitMask is 0x010 (= 2)
The AND operation result is 0x010. This is Non-Zero so the collision is occurred.
So You should change wheel's categoryBitMask value for avoiding logical AND operation's result becoming Non-Zero, like below.
wheel.physicsBody.categoryBitMask = 8;
In addition, the dynamic property have to be set to YES.