I had a similar issue with one of my users.
My App does not use FTP but HTTP for streaming, and in this case, escaping the "@" character should solve the issue.
Problem is, that an "@" is interpreted as login prefix. Imagine user = "user" and password = "p@ss" results in user:p@ss@server... So only "p" is used as password while ss@server is used as server name. I haven't tried, but I guess also using ":" could cause troubles, at least in the user name
Composing the stream URL including username and password in the user:pass@server is maybe the easiest but not the most secure solution, as both is part of the URL of the request. Usually it is much better to add username and password to the request header - which works fine in my app for querying XML data.
With the stream URLs passed to VLC, this seems much more complicated. Room for improvement. In VLCKit I assume the only way would be to setup a Dialog Provider, that is returning the saved credentials on first call and presenting the login screen on later invocations.
Well, when a user runs into it, there is still a change to convince the user to change his password