Google の推奨に従って、API レベル 15 プロジェクトに HttpsURLConnection を使用しています。
私のテストケースは非常に単純です:
URL url = new URL(STATS);
HttpsURLConnection we = (HttpsURLConnection)url.openConnection();
InputStream in = new BufferedInputStream(we.getInputStream());
WiFi 経由でサーバーに接続すると、すべて正常に動作します。
3g 経由でサーバーに接続すると、Apache ログに次のエラーが記録されます。
Hostname 202.139.83.152 provided via SNI and hostname myserver.com provided via HTTP are different
これで、202.139.83.152 アドレスがモバイル プロバイダーの APN のプロキシ アドレスになります。
両方のリクエストの 'Client Hello' パケットをダンプしました。Handshake Protocol/Extension:server_name フィールドには、wifi リクエストのターゲット ホスト名 (myserver.com) が含まれていますが、3g リクエストの APN プロキシ アドレスが含まれています。
これは :
- 間違ってコーディングしたもの
- 携帯電話 (Samsung Galaxy S3) で誤って構成したもの
- サーバーで誤って構成したもの
- モバイルプロバイダーが行っている悪いこと
- Android ライブラリのバグ
私のサーバーは、この vhost に専用の IP アドレスを使用しています。
DefaultHttpClient の単純なサブクラスを使用して 3g 経由でリクエストを正常に作成できますが、最小 API レベルが 15 であるため、「優先」パスに進むことを望んでいました。
どんな提案でも大歓迎です。この基本的なことを機能させるために、私はあまりにも多くの時間を費やしてきました。
このプロジェクトの iPhone 開発を担当している私の同僚は、彼のコードが「箱から出してすぐに動作する」という理由で首を横に振っています。