The problem turned out to be a CSS transform that was applied to the canvas to flip the frame along the vertical axis. For some reason, Android Chrome was able to handle this, but iOS was not.
I was able to resolve the issue by removing the transform and mirroring the frame using cv.flip() instead.