Unity, iOS и IPv6
С 1 июня 2016 года, все отсылаемые приложения в AppStore должны уметь работать по IPv6.
Unity вроде как решили все эти вопросы еще в прошлом году. Но если погуглить, то оказывается, что некоторые получают отказы до сих пор, по тем или иным причинам связанным с IPv6. Чтобы проверить работает ли ваше приложение в сетях IPv6, Apple написали специальную статью с мануалом. Я ей воспользовался и обнаружил, что приложение не коннектится к серверу :(
Для соединения используются сокеты, поэтому код был очень простой:
...
private Socket _socket;
public static void Connect () {
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.BeginConnect("134.253.17.11", 10001, new AsyncCallback(OnEndConnect), null);
}
void OnEndConnect (IAsyncResult iar) {
Debug.Log ("connected");
}
...
Собственно, сразу стало понятно в чем проблема — AddressFamily должен быть InterNetworkV6 если работаем по IPv6 или InterNetwork для IPv4.
Если подключаться к серверу по домену, то можно воспользоваться таким решением — передаем хост, указываем тип, в ответ получает IPv6 или «обычный» IP адрес.
Если же подключение осуществляется по IP адресу, то преобразование с помощью различных конвертеров в IPv6 (раз, два), не дало работающего результата — сокет просто не подключался.
Ответ был найден в том самом мануале от Apple (смотрим на подраздел Use System APIs to Synthesize IPv6 Addresses) и на одном китайском сайте :) Если все это объединить, то получится более-менее универсальное решение которое будет работать и по IPv6, и по IPv4, в iOS и Android.