I'm not sure I understand your question properly, but le me explain a bit more how it works.

The openConnectionWithInfo will substantially continue trying to connect until either it succeeds or you interrupt it. It is a synchronous operation, but you can actually treat it as an asynchronous one: you run it on a background thread and forget about it. You get notified of the outcome of each tentative connection, via the delegate, and there is where you decide what to do.

The didReceiveServerFailure event carries an LSPushServerException object, which in turn carries an errorCode. This code is provided by the server, and in some cases even by your Metadata Adapter. You may decide what to do based on this code, or you may count the number of tentative connections, or whatever. All you have to know is that if you call closeConnection it will stop trying, if you don't it will continue trying (with the notable exception of didEndWithCause).

If you react by closing the connection, then yes: you have to reopen the connection from the beginning and redo all subscriptions. But checking the condition appropriately should let you limit this reaction to when it is strictly necessary (e.g. if credentials are wrong, and not if you have a network glitch).