iOSアプリ、リジェクト(IPv6編)

こんにちは、毒きのこです。

先日Apple先生にiOSアプリを申請したところたくのアプリ、IPv6環境化でクラッシュしたからリジェクトね」と言われてどん詰まり状態で御座います。

Apple先生から来た内容の一部を抜粋すると

Your app crashes on iPad Air 2 and iPhone 6 running iOS 10.1 connected to an IPv6 network when we:

The app crashes after we enter the demo account and try to log in.

This occurred when your app was used:
– On Wi-Fi

向こうの環境下でIPv6にて通信を行ったところ、「ログインのところでアプリが落ちてますよ〜」といったような感じ。

これ、来たからには何とか解決しないといけないわけですが、色々ググると過去の事例として「うちでは再現しませんでした」と報告することで手のひらを返しそのまま審査通過、なんてパターンもあるみたいで…

ちなみにうちもそれやりましたが、全く同じようなコピペが問題解決センターの方に返ってきただけでした…

とりあえずiOSアプリ開発におけるIPv6対応、サーバー側、クライアント側でどういう状況になってるか軽く見ていきたいと思います。

サーバー側対策

このIPv6なんですが、サーバー環境で対応するとなると例えばAWSを使用していた場合、S3に対してのリクエストは対応している模様。

IPv6 を使用して Amazon S3 に対するリクエストを実行 – Amazon Simple Storage Service

ただS3だけじゃあ自分のアプリの場合ちょっと意味なくて、通常のEC2へのリクエスト等もIPv6で問題ない形にしたいのですが、僕が知る限り現状AWSはIPv6非対応で、EC2-Classicでロードバランサ経由でしたらいけるのですが、2013年以降にAWSアカウント取得したユーザーはEC2-VPCしか提供されないので、これ無理です。

と思ってたら、どうも先月くらいにCloud FrontでIPv6対応されたとの記事が。

IPv6 サポートの更新 – CloudFront、WAF、S3 Transfer Acceleration | Amazon Web Services ブログ

ただここで個人的に問題が、今回のうちがリジェクト食らったアプリはAWSで主なAPI群を用意してなく、さくらVPSなんですよね…。

で、さくらVPSはIPv6対応されていて以下のように設定すれば問題なく使えます。

IPv6アドレスの設定方法
サービス・プラン表示ここから
対象サービス・プラン
 
サービス・プラン表示ここまで
IPv6アドレスを設定する方法です。

IPv6に関する情報の確認
IPv6アドレスの設定

注意事項

CentOS6でのIPv6アドレスを有効にする設定です。
その他のOSでの設定は、各OSのマニュアルをご確認ください。

IPv6に関する情報の確認
VPSコントロールパネルログイン
VP…

うちはOS、Ubuntuですがインターフェースに追加してやって普通にping6で疎通確認できてます。

つまりサーバー側はIPv6での対策は取れていて問題ない…はずなんですよね。(謎)

クライアント側対策

次に同じようにクライアント側ですが、当方のアプリSwift3.1 + Xcode8.1にて開発したものになります。ちなみに前回Swift2.3 + Xcode7.3で開発・リリースしたものは一切IPv6について当時のレビュワーには指摘されませんでした。(違うアレでリジェクトは喰らいましたが)

そうなると、クライアント側で使用しているライブラリ等が怪しくなってくるのですが、今回アップデート対応ということでクライアント側で変更したのはちょっとしたUITableViewのCell追加とか、いわば通信に一切関係ないUI部分の改修程度です。

前回はたまたま指摘されなかっただけで、今回見事チェックされちゃったって感じでしょうか。

そこで対策として有名な、Apple先生もこちら検証してと必ず言ってくる以下の方法。

MacによるDNS64/NAT64WiFiアクセスポイントの動作を確認してみました | Developers.IO
1 はじめに 2016年6月1日から、iOS9ではIPv6環境で動作することを審査でチェックされます。 Supporting IPv6-only Networks そして、OS X 10.11以降で、DNS64/NAT6 […]

クラスメソッド様が丁寧にまとめてくださってますね。

基本的にはここにあるように設定し実機で試してやればいいわけですが、当方のアプリ、当然コレでもApple先生の言うように該当箇所でクラッシュするといったことは再現できず…

これでも再現されないとなると、後はApple先生のとこのドキュメントにもありますがクライアント側のコードで以下のようなIPv4固有のAPIが実装されていたら、それ当然IPv6ではコケるので、自身のプロジェクトとライブラリ群どちらもgrepかけチェック。

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

うちのアプリでは該当するAPIは叩いてませんでした…。

結論

それじゃあどうすればいいの?

そうなんです。どうしていいかわからず、とりあえず大好きなパズドラをひたすらやって現実逃避してる昨今で御座います。

でもプロジェクトでどういうライブラリを使ってるかこのブログだけじゃ判断出来ませんし、上記のAPI叩いてないとはいえ怪しいコード書いてるかもしれないですもんね…。

アプリの内容としては良くあるチャットアプリで、クライアント側(Swift)で使用してるライブラリとしては以下のような極めて一般的な有名どころばかりでございます…

  • Socket.IO-Client-Swift
  • Alamofire
  • Fabric
  • Crashlytics

通信してるのってこんぐらいなんですよね… ちなみにどれも最新のバージョンです。
※AlamofireだけiOS8.0にも対応させるために最新だと9以上かな?必須のAPI内部で叩いちゃってるんで、最新のものではなく自分でforkしてそこ叩かないよう一部変更はしてます。

それくらいなんですよねぇ、
そもそもNAT64/DNS64で検証してクラッシュしないんだからこれ以上調査しようもないんですよねぇ…

はぁ、とりあえず久々にダークサイドに陥ってるわけですが、引き続きパズドラ…じゃなくアプリの方何か解決策ないか調査の方続けていきたいと思います。

スポンサーリンク
336 x 280 レクタングル(大)
336 x 280 レクタングル(大)