*始めに [#ce4eb3fe] 2018年5月頃にcocos2d-xのver2.6系のアプリをApp Storeでアップデートしようとしたら、 Your app continued to crash on iPad running iOS 11.3.1 connected to an IPv6 network when we tapped the 新規ゲーム button. と言われてリジェクトされました。 その時の顛末を記しておきます。 *リジェクト [#c74a12f5] **一度目 [#d37fa9b1] 最初にアップデートしようとしたとき、IPv6に対応していないと行けないということはすでに知っていたので、curlなど必要なライブラリはアップデート済みでした。にもかかわらずクラッシュレポートが送られてきました。また、以下のページを参考にIPv6で接続しても、特にクラッシュすることもありませんでした。 [[IPv6 DNS64/NAT64ネットワークのサポート:https://developer.apple.com/jp/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html]] おかしいなと思いつつライブラリの入れ替えなどを行ってもう一度サブミットしました。 **二度目 [#i10d77c4] 二度目のバイナリも再びリジェクトされました。しかも、クラッシュレポートを見る限り全く同じ場所(curl_easy_cleanup)でした。 テストしてもやはり特に問題なく、どうしたものかと思いましたが、とりあえずcurlのバージョンを変えてバイナリ登録しました。 しかし、これもクラッシュしてリジェクトされました。クラッシュした場所は変わらずcurl_easy_cleanupでした。 *最後の手段 [#s591754e] こちらでテストしても問題なく、もうどうしようもなさそうなので、最後の手段としてcurlを使わずにhttps通信を行う事にしました。 つまり、iOSネイティブのobjective-cでhttps通信する関数を書いて、それを呼び出すことにしました。 以下のような関数を定義して、cocos2dxの中から呼び出しました。 - (void)get: (NSString *)urlString{ NSURL *url = [NSURL URLWithString:urlString]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSOperationQueue *queue = [NSOperationQueue new]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *res, NSData *data, NSError *error) { if( error ){ NSLog(@"HttpGetError"); } else { NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"get data %@", responseString); } }];} 幸い、httpsのgetメソッドしか使っておらず、objective-cのコードとcocos2d-xとの間を簡単にやり取りできるようにするEasyNDKというライブラリを使っていたので、半日ぐらいで修正できました。 これでなんとかApp Storeの審査を通りました。 Android側と別コードになるので、良い方法かどうかは微妙ですが、最後の手段として使えます。 curlについてはIPv6対応やssl対応、Androidでの脆弱性などいろいろ苦しめられてきたので、今後も似たような問題が起こるリスクを考えると、それほど悪いやり方ではないかも知れません。
(This host) = https://njf.jp