Search Unity

Appleは2016年6月1日以降、App Storeに登録されるすべてのアプリはIPv6ネットワークのサポートを必須とする、と発表しました。たくさんのUnity開発者がApp Storeでゲームを公開していますから、私たちも時間をとってその対応を検討してきました。なお、この要件は、新しいアプリの登録と更新の両方に適用されます。

IPv6って?

Internet Protocol Version 6(IPv6)は、Internet Protocol (IP)の最新バージョンです。インターネット上でネットワーク上のコンピュータの識別とトラフィックのルーティングを行う通信プロトコルです(Wikipediaより)。端末は、IPv4ネットワーク(今まで通り)とIPv6ネットワーク、または両方のプロトコルが同居するネットワークで動作することができますが、Appleの新しい審査の要件は、このうちIPv6ネットワークでアプリが動作する必要がある、ということになります。

ここで、IPv4とIPv6はお互いにトンネリング技術によってもう一方のプロトコルのネットワークを通過することができるが、それら自体は相互に通信できないことに注意しておきましょう。

UnityはIPv6をサポートしているの?

はい、もちろん!WWWとUnityWebRequestは、Appleの高レベルネットワーキングAPIを利用しているので、そのままでIPv6に対応しています。また、私たちは過去数か月間かけてUnityの.NET/IL2CPPライブラリーにIPv6ネットワークのサポートを加えることに取り組んできました。最後の.NET/IL2CPPに関連するIPv6のバグは、5.3.4p4のパッチリリースで修正されています。UNETにおける修正がひとつだけ残っていますが、それも今後数週間で修正がリリースされる予定です。私たちのコミュニティにおける偉大な仲間たち(Exit Gamesのような)のおかげで、Unityエンジンに潜んでいた数多くのバグを取り除き、以下のプラットフォームでIPv6ネットワークをサポートすることができました!

  • エディター(Windows/Mac/Linuxすべて)
  • プレイヤー(Windows/Mac/Linuxすべて)
  • iOS
  • Android

今後、上記以外のプラットフォームについてもIPv6のみのネットワークのサポートを追加していく予定です。

以前のバージョンについては?

ネットワークリソースへのアクセスにWWWかUnityWebRequest APIだけを使用している場合は問題ありません。もちろん、万が一に備えて入念にテストするのがよいでしょう。

また、複数の旧バージョンに.NET/IL2CPPの修正をバックポートし、4.7.2、5.1.5、5.2.5としてリリースする予定です。

で、どうしたらいいの?

まず、すべてのゲームの機能が意図した通り動作するかどうか、IPv6ネットワーク上でゲームをテストします。Appleのガイド、OS X 10.11以降を搭載したMacを使ってIPv6のみのネットワークを構築する方法を解説しています。これでApp Storeのレビュワーと同じテスト環境を構築できますから、IPv6のテストを始めるのにぴったりなのです。IPv4とIPv6ネットワークは相互に通信できませんから、何の問題もないか確認するためにはIPv6のみのネットワークでテストする必要があるのです。もしテスト端末がIPv6とIPv4両方に接続してしまっていると、通信処理はIPv4を使って成功できてしまいます。

次に、プログラムに以下のような問題を起こす可能性があるコードがないかチェックしましょう。

  • IPv4アドレス(127.0.0.1, 8.8.4.4のような)の使用。こういったハードコードされたアドレスはすべて削除する必要があります。接続しているネットワークに応じた適切なアドレスが使われるよう、ホスト名を使用しましょう。
  • IPAddress.AddressFamily プロパティの使用。もしこのプロパティを元に処理を分岐している場合、IPv6の場合の対応をちゃんとしなくてはいけません。
  • IPAddress.Any と IPAddress.Loopback フィールドの使用。これらはIPv4用であり、IPv6用ではありません。IPv6のサポートのためには IPAddress.IPv6Any と IPAddress.IPv6Loopback フィールドを使いましょう。

上記に挙げたもの以外の問題が発生した場合、必要な修正が行われたバージョンを使用していることか確認してください。まだ使っているバージョンで修正がリリースされていない場合、修正バージョンがリリースされるまで待ってからバージョンアップしてください。

サードパーティ製で通信を行うネイティブもしくはマネージドのプラグインもIPv6ネットワークと互換性がない可能性がありますので、プラグインベンダーに確認することをおすすめします。

最後になりますが、もしIPv6に関わるUnityのバグに遭遇したら、ぜひ私たちにご報告をお願いします。そうすれば迅速に問題を修正することができるでしょう。また、App Storeの審査要件に関する問題は、私たちのiOSとtvOS開発についてのフォーラムでどうぞ。そこで一緒に問題を解決しましょう。

更新: 4.7.2がリリースされました!: http://unity3d.com/get-unity/download/archive
更新その2: 5.2.5がリリースされました!: http://unity3d.com/get-unity/download/archive (5.3.xの下)
更新その3: 5.1.5がリリースされました!: http://unity3d.com/get-unity/download/archive (5.2.xの下)

55 コメント

コメントの配信登録

コメント受付を終了しました。

  1. HI,
    Does unity has any equivalent method to CAPI “getaddrinfo”?
    I tried to synthesize an IPv6 address from IPv4 address manually, by using “Dns.GetHostEntry” and “Dns.GetHostAddresses”, and none of them worked.
    We need this, because some of our submissions using fixed prefix(“64:ff9b::”) were rejected by Apple, though it works fine with our MAC sim testing pure ipv6 env.
    Any suggestion?
    Thank you!

    1. Mantas Puida

      6月 15, 2016 11:30 pm

      Could you please forward me (mantas@unity3d.com) rejection letter you got from Apple?
      Thanks!

    2. ALEXANDER BOGOMOLETZ

      6月 17, 2016 4:57 pm

      I was planning to use this workaround too.
      If you find any solution to it please post here or keep in touch via email!
      Thank you!

  2. Submitted 2 bug reports:

    Socket.OSSupportsIPv6 throwing an exception on Android: https://fogbugz.unity3d.com/default.asp?803576_dd4igthvr1jva96j

    and

    Hostname only being accepted for TcpClient.BeginConnect on iOS (throws an exception on Editor/Android): https://fogbugz.unity3d.com/default.asp?803613_bnc234pfm7rrvtg7 (sync Connect() works, but seems to connect to the IPv4 ip – at least in the editor)

    1. Mantas Puida

      6月 15, 2016 11:28 pm

      First bug is already assigned to Android team grabbag and second one is in QA queue. Any issues that would prevent shipping game on iOS?

      1. Nothing that prevents shipping, though I’m still getting rejected :D Running their test by setting up a DNS64/NAT64 network locally through a Mac works fine, but no info from Apple about why they’re rejecting it

        1. Mantas Puida

          6月 17, 2016 6:53 pm

          Could you please forward rejection letter to mantas [at] unity3d.com?
          Thanks!

  3. Pavel Alieinikov

    6月 6, 2016 8:36 pm

    Hi, I am deploying dedicated server made on UNET and when I start server I try to get list of all IPs (both IPv4 and IPv6). My server is deployed on Linux server on DigitalOcean with IPv6 support enabled, server can be pinged via IPv6 address. When I connect via IPv4 from client to server (from NetworkClient to NetworkServer) – everything works fine, however, when I connect via IPv6 – I get timeout error. I am using Unity 5.3. Strange thing is that it seems to work fine on Windows server, but doesn’t work on Linux. Can anybody help me out with this issue?

    1. Mantas Puida

      6月 7, 2016 2:34 am

      Could you please make a bugreport with some small repro case attached to it and share your case number?
      Thanks!

  4. Grateful for 4.7.2 . Unfortunately it doesn’t work for me . My ipv6 code is failed . I build my ios player with il2cpp and the problem “An address incompatible with the requested protocol was used” is the same as using old unity version . The good news is that the same code works when i change the build setting to using mono(2.x) not using il2cpp . Maybe there are some bugs in il2cpp . And my work condition must uses il2cpp . Btw thanks unity .

    1. Mantas Puida

      6月 5, 2016 9:49 am

      Please submit a bugreport and share your case number.
      Thanks!

      1. Alexander Bogomoletz

        6月 7, 2016 12:41 pm

        I have similar issue in 5.4.0b20 with Udp socket when reading Socket.LocalEndpoint property.

        1. Mantas Puida

          6月 7, 2016 5:37 pm

          Thanks for reporting!
          Developers are looking into Socket.LocalEndpoint issue.

      2. Alexander Bogomoletz

        6月 7, 2016 1:44 pm

        I submitted a bug with description, case 803569

      3. I have same issue in 4.7.2f1 with ” “An address incompatible with the requested protocol was used” . Does unity solve it?

  5. I am so relieved that 4.x will support this…
    Thanks Unity.

    1. Thanx.

  6. That great, could I know when will have the patch 4.7.2 release?

    1. Mantas Puida

      5月 30, 2016 2:06 pm

      It’s undergoing latest testing stages right now. I believe it will be out early this week. Fingers crossed.

      1. HI, I run a simplified code with version 5.3.5, exception occurred at: m_testSocket.LocalEndPoint, with “An address incompatible with the requested protocol was used”, by ignore this, everything is OK now. I will re-test 4.7.1 and 4.7.2 later. Thank you!

        1. Mantas Puida

          6月 2, 2016 10:49 am

          Hmm.. Could you please submit a bugreport for 5.3.5 and share your case number?
          Thanks!

        2. HI, Mantas Puida, I’d like to, please give me a bug report url. It is the same with 4.7.1, receive operation is OK, but m_testSocket.LocalEndPoint throw an exception. Thank you!

        3. Mantas Puida

          6月 2, 2016 2:03 pm

          In Unity Editor activate Help menu and pick “Report a Bug…” there.

        4. I reported a bug, case 802618, thank you!

    2. HI, Our server has only ipv4 address, so We add the prefix”64:ff9b::” as you mentioned early, but it works only in one direction : it connect to the server, send data to the server(and server received it), but can not receive from the server, no data received. Receive code as follows( it works with ipv4, but not ipv6):
      m_testSocket.BeginReceive(m_rcvBuff, m_rcvBuffEnd, RCV_BUFF_SIZE -m_rcvBuffEnd, SocketFlags.None, new AsyncCallback(ReceivedDataCallback), m_testSocket);

      Any suggestion? Thanks!

      1. and our unity version : 4.7.1

        1. Mantas Puida

          5月 31, 2016 12:59 pm

          I believe you are hitting known issue. You should wait for 4.7.2 release, which is expected to happen very soon.

  7. Great to hear that there will be an 4.7.2 update !

    1. 4.7.2, thats nice…
      I’m glad to hear that too.
      I think Unity should not drop support for version 4.7.x until Unity 6 is out.
      Which means Unity can keep supporting the last 2 Major releases (at least) concurrently. Many big software companies do support the current major version of their software + at least 1 previous major version.

  8. Martin Nielsen

    5月 13, 2016 9:43 am

    So, we are heavily relying on AssetBundles in our game, and are currently using 5.2.4f1 for best performance. Assetbundle loading is heavily broken in the 5.3.4 patch line.

    Any ETA on the IPV6 backport to 5.2.4f1 or a definitive Assetbundle fix for 5.3.4p1-6 ?

    We are caught between two gamebreaking issues, and are facing the possibility of not being able to publish new content.

    1. Mantas Puida

      5月 13, 2016 7:14 pm

      What API are you using to download Asset Bundles? If it’s WWW class then you should be fine your current version, but please do test it carefully in ipv6-only setup.

      1. Martin Nielsen

        5月 17, 2016 3:34 pm

        Its not downloading Assetbundles that is broken, that works just fine. But everything related to Assetbundle.LoadAssetAsync() is completely broken in 5.3.4. Our entire loading structure is based on async loading, so we cant change that.

        Our next best step is to try Unity 5.3.3 and hope its IPv6 ready, as Assetbundles loading seems to be working there.

    2. Mantas Puida

      6月 1, 2016 7:09 pm

      5.2.5 is out now, link is at the bottom of blogpost

  9. Rasmus Kristensen

    5月 12, 2016 4:16 pm

    Any ETA on the patch releases for 5.1 and 5.2?

    1. Mantas Puida

      5月 13, 2016 11:18 am

      We are working on them, but hopefully we will know better about actual shipment dates next week.

    2. Mantas Puida

      6月 1, 2016 7:10 pm

      5.2.5 is out now, please check bottom of the blogpost

  10. i try to use the socket to connect ipv6 address, it works fine in ipv4 and ipv6 networks, but has a 10051 err code in ipv6-only network. why?

    1. Mantas Puida

      5月 12, 2016 11:07 am

      Did you setup ipv6-only testing environment properly. Like can you reach http://www.apple.com from iOS device in this setup?

        1. Mantas Puida

          5月 13, 2016 11:26 am

          Are you also getting similar errors in Safari on the iOS device?

      1. no. i have not got any err in safari on my device. i can access the web page.

        1. Mantas Puida

          5月 14, 2016 2:06 pm

          Do you have sample code to share on how are you testing it?

      2. //********** my ipv6 testing code **********
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(“::ffff:118.123.216.87”),10001);
        Socket m_Socket = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        m_Socket.Connect(ep);
        //********** end code **********************
        i will get a 10051 err code in ipv6-only, bu it’s fine in ipv4. And the err occurs in API ‘Connect’.

        1. Mantas Puida

          5月 18, 2016 11:37 pm

          Apple NAT64 test environment seems to not like “::ffff:” prefix, use “64:ff9b::” instead as noted in https://tools.ietf.org/html/rfc6052. In general it is highly advisable to use hostnames everywhere instead of direct IP addresses.

        2. https://forums.developer.apple.com/thread/46545

          An Apple staff said

          > it is not safe to form an IPv6 address by combining an IPv4 address with the Well-Known Prefix (64:ff9b::/96). This may work in some NAT64 networks but it is not a general solution to the problem.

      3. thanks for your answer.
        today, i have changed my testing code. like this:
        //********** my ipv6 testing code **********
        IPAddress[] _ips = Dns.GetHostAddresses(“test.ts.ls.dkmol.cn”);
        IPEndPoint ep = new IPEndPoint(_ips[0],10001);
        Socket m_Socket = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        m_Socket.Connect(ep);
        //********** end code **********************
        it’s fine in ipv4, but get an err message “No such host is known” in ipv6-only. And the err occurs in API ‘Dns.GetHostAddresses’.

        1. my unity version is 4.7.1.

        2. Mantas Puida

          5月 19, 2016 11:11 am

          Similar code works for me fine on Unity 5.3.4p6.
          Fixes for Unity 4.7 are not yet released, we are working on them.

  11. what abou webgl sockets, is it supported there?

    1. WebGL routes all its networking through javascript (the browser) using external calls, so it uses whatever the browser is using.

  12. I just scanned our game project for any IPAddress class usage. It looks like Unity Test Tools are using this class, perhaps you guys should update that to support the new requirements?

    1. Mantas Puida

      5月 11, 2016 12:58 pm

      Thank you, we will look into it. Just note that use of test tools should not affect your iOS game submissions.