*

cocos2d-xのSupporting IPv6-only Networks対応

公開日: : cocos2d-x, iOS, イーモン , ,

2016年6月1日より、AppStoreに更新されるすべてのアプリは、IPv6-only networkingのサポートが必須になった

Supporting IPv6-only Networks(apple developer)

NSURLSessionとCFNetwork APIはすでにIPv6をサポートしているので、ほとんどのアプリは影響を受けないということですが、私のアプリはリジェクトされました。

使っていたcocos2d-x.3.3のライブラリがIPv6に対応していなかったようです。


2.2 - Apps that exhibit bugs will be rejected
2.2 Details

We discovered one or more bugs in your app when reviewed on iPad running iOS 9.3.2 and iPhone running iOS 9.3.2 on both Wi-Fi and cellular networks.

- Specifically, we were unable to access to any of your app contents. Even after we tapped on TOUCH SCREEN nothing happened.

Next Steps

Please run your app on a device to identify the issue(s), then revise and resubmit your app for review. 

Apps are reviewed on an IPv6 network. Please ensure that your app supports IPv6 networks, as IPv6 compatibility is required.

For additional information about supporting IPv6 Networks, please refer to Supporting iPv6 DNS64/NAT64 Networks.

For a networking overview, see About Networking.

If we misunderstood the intended behavior of your app, please reply to this message in the Resolution Center to provide information on how these features were intended to work.

For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue(s). For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue(s).

Resources
If you have difficulty reproducing a reported issue, please try testing the workflow described in Technical Q&A QA1764: How to reproduce bugs reported against App Store submissions.

If you have code-level questions after utilizing the above resources, you may wish to consult with Apple Developer Technical Support. When the DTS engineer follows up with you, please be ready to provide:
- complete details of your rejection issue(s)
- screenshots
- steps to reproduce the issue(s)
- symbolicated crash logs - if your issue results in a crash log

Screenshot_0.png

IPv6対応のまえに

Supporting IPv6-only Networks(apple developer)から一部翻訳

DNS64/NAT64とは

IPv4のコンテンツへのアクセスを維持しながらIPv6-only networkを実現ために、採用されているDNS/NAT中継サーバー。

クライアントがDNS64サーバーにDNSリクエストを送信すると、DNS64サーバーはDNSサーバーからIPv4のアドレスを取得し、合成IPv6アドレスをクライアントに返す。

クラインはNAT64ゲートウェイに合成IPv6を使ってリクエストすれば、NAT64ゲートウェイが適切にIPv4サーバーにアクセスしてくれる。

アドレスをリテラルで指定しない。ホスト名を使う

DNS64への問い合わせが必要になるので、アドレスはホスト名を指定する。

ホスト名のなしにIPv4のアドレスを合成IPv6に変換する方法も用意されているようです。
Use System APIs to Synthesize IPv6 Addresses

事前のネットワーク診断はしない。まず接続を試みること

多くのアプリでSCNetworkReachabilityCreateWithAddress(Reachabilityなどで)が事前の接続確認を目的として使われている。

この結果はインターネット接続の有無を保証するものではないので、接続確認は行わず、エラーハンドリングで対応することが適切なフローになる。

またその際には、SCNetworkReachabilityCreateWithNameでホスト名を使用すべきである。


	//推奨されないコード
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    
    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);

問題が起こる可能性のある関数など



inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()

AF_INET
PF_INET
struct in_addr
struct sockaddr_in
kDNSServiceProtocol_IPv4

sockaddr_storage

cocos2d-xの更新

外部ライブラリのcurlとlibwebsocketを更新する必要あり

一週間前にcocos2dのIPV6に対応の記事がでていました。

IPV6-ONLY NETWORKS NOW SUPPORTED(2016/5/26)

Cocos2d-x has been upgraded to support IPv6-only networks.

For both v2.x and v3.x, you can just update CURL and libwebsockets. To do this:

IPv6対応したcurlとlibwebsocketのオブジェクトファイルとヘッダーファイルを持ってきて既存のプロジェクトに上書きすればよさそうです。

既存プロジェクトのcocosは更新したくないので、使っていない別のcocos2d-x-3.10で以下を実行します。

  1. cocos2d-xのルートディレクトリに移動して、external/config.jsonを編集

    versionをv3-deps-94に修正します。

    
    {
        "version":"v3-deps-94",
        "zip_file_size":"124402591",
        "repo_name":"cocos2d-x-3rd-party-libs-bin",
        "repo_parent":"https://github.com/cocos2d/",
        "move_dirs":{
            "fbx-conv":"tools"
        }
    }
    
  2. download-deps.pyを実行します
    
    (jtsm @ 15 ~) $ cd cocos2d-x 
     
    (jtsm @ 15 ~/cocos2d-x) $ ./download-deps.py 
     
    ======================================================= 
    ==> Prepare to download external libraries! 
    ==> Ready to download 'v3-deps-94.zip' from 'https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/archive/v3-deps-94.zip' 
    ==> WARNING: Couldn't grab the file size from remote, use 'zip_file_size' section in '/Users/jtsm/Chukong-Inc/cocos2d-x/external/config.json' 
    ==> Start to download, please wait ... 
    ==> Downloading finished! 
    ==> Extracting files, please wait ... 
    ==> Extraction done! ==> Copying files... 
    ==> Cleaning...
    

関連ファイルを上書き

更新したcocosから、必要なファイルだけを既存プロジェクトのcocosに上書き・追加します。


cocos/network/WebSocket.h
cocos/network/WebSocket.cpp
external/curl/include/ios/curl/*.h
external/curl/prebuilt/ios/libcrypto.a
external/curl/prebuilt/ios/libcurl.a
external/curl/prebuilt/ios/libssl.a
external/websockets/include/ios/libwebsockets.h
external/websockets/include/ios/lws_config.h
external/websockets/prebuilt/ios/libwebsockets.a

コンパイルエラーの修正

libwebsocketの修正によってWebSocketでエラーがでるので修正します。

修正内容はこちらで公開されています。

"libwebsocket"から"lws"への文字列置換と、onSocketCallbackのインターフェイス修正ですね。

とりあえず、これでコンパイルが通り、動くようになりました。

DNS64/NAT64対応のテスト:Test for IPv6 DNS64/NAT64 Compatibility Regularly

もっとも簡単なテスト方法は、マックを使ってローカルなWiFi IPv6 DNS64/NAT64ネットワークを構築することだそうです。

手順

最終的に有線でMACをインターネットに接続させ、テスト端末をWiFiでMACに接続します。

まずはマック側から

  1. 有線でMACをインターネットに接続します。(私はUSB変換ケーブルで接続しました)
  2. [システム環境設定]を開いて、Optionキーを押したまま[共有]をクリックし、Optionキーを離さず

  3. [インターネット共有]の項目を選択(チェックボックスは無効のまま)して、Optionキーを離します

    スクリーンショット 2016 06 03 10 08 43

    ◆ 共有する接続経路:有線のもの
    ◆ 相手のコンピュータでのポート:Wi-Fi
    ◆ NAT64ネットワークを作成:チェック

  4. Wi-Fiオプションをクリックして、セキュリティをWPA2 パーソナルにして適当なパスワードを設定

  5. インターネット共有のチェックボックスを有効にして、ローカル IPv6ネットワークをスタートさせる

    インターネット共有開始されるとこのようなアイコンが表示されます。

テスト端末側

  1. 念のためモバイルデータ通信はオフにしておきましょう
  2. WiFiを有効にして先ほど設定したMACに接続します
  3. Safriなどでインターネットに接続できるか確認します
  4. 確認くんでみると有線のグローバルIP(IPv4)が表示されます。ローカルのIPv6ネットワークから、IPv4ネットワークにアクセスできていることがわかります。
  5. 目的のアプリの動作テスト・・・

Sponsored Link

関連記事

checkbox.png

確認ダイアログ付きチェックボックス(Checkbox)

図のようなチェックボックスとアラートの組合せを実装しようとした際にiOSには外観などを簡単にカスタ

記事を読む

ace.png

イーモンxエースクラウン「Aの塔」決定

あの英和辞典エースクラウンがイーモンに登場します! エースクラウンで取り上げられている会

記事を読む

2015_ec1.png

イーモン プレビュー動画

動画2作目、お正月っぽく

記事を読む

ace.png

イーモン v2.2審査

v2.2を審査に出しました! イーモンxエースクラウンの特別クエストが追加されます!

記事を読む

sample.png

cocos2dxでhttp通信のprogressを表示する

cocos2d-xでは、ダウンロードの進捗を取得するインターフェイスが用意されていないような

記事を読む

statusbar2.png

ステータスバーとナビゲーションバーを含まない領域を取得する

iOS7からUIViewControllerのview.boundsはステータスバーやナビゲーシ

記事を読む

teach_s.png

[eMon] English Monstersレビュー申請中

先日、新しいiOSアプリを審査に出しました。 English Monsters(略してeM

記事を読む

blog.png

cocos2d-x v2.2からv3.3rc0 その2

イーモンを鋭意更新中です。 アイキャッチは魔法使いの高ランク装備グラです。 coc

記事を読む

kii1.png

Kii Cloudオブジェクトエディタ

現在作成しているゲームで使うMBaasとしてKii Cloudを検討しています。 和製のMBa

記事を読む

IMG_2206.JPG

【イーモン】プロモーションムービー

デザフェスで使ったプロモーションムービーです! 当日は、AppleTVをつかってiP

記事を読む

Sponsored Link

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Sponsored Link

  • 発音辞書イーモン
  • English Monsters
  • sLog(時間管理アプリ)
  • 生粋のC++プログラマーです。 最近は、Objective-Cやxcode、cocos2d-xなどを学びながらiPhoneアプリを開発しています。

Google+ Google