A callback called “will connect” is not proof that the CFStream is still configurable. Apple's CFReadStreamSetProperty contract says to assume properties must be set before open unless their own documentation states otherwise.

For an existing stream integration, keep the sequence together: create the stream/pair, build the correctly typed SOCKS dictionary, set the appropriate property and check its Boolean result, then register events and begin opening.

A false result is configuration failure, not an installed route. Check stream type, property key, dictionary value types and lifecycle before continuing.

In an event-driven arrangement, open can begin without finishing negotiation. Observe status and error events before treating the connection as usable.

If another library owns the stream, use its documented pre-open hook. A later-only callback may be the wrong integration point. Changing properties on an already open stream cannot move that existing connection to SOCKS.

Artihkkalat mat laktásit