web-dev-qa-db-ja.com

Xcode 9 iOS 11ボーリングSSL SSL_ERROR_ZERO_RETURN

簡単なプログラムHelloWorldをiOS上で実行しています。同じコードが長い間正常に動作しています。最近、プログラムが私のMacbookのXcode 9に接続されている私のiPadで実行されているとき、以下のBoringSSLエラーが発生することに気付きます。シミュレータでプログラムを実行しても、このエラーは表示されません。 iOSは11.2です。 Xcodeは9.2です。

私のコードはBoringSSLを参照していません。ただし、httpsをサーバーに呼び出すためにNSMutableURLRequestを使用します。呼び出しは問題なく動作し、BoringSSLメッセージを除いてすべて問題なく動作するようです。

メッセージが表示される理由をデバッグできる方法はありますか。 HellowWorld [466:85961]、この2つの数字はどういう意味ですか?

メッセージの意味と回避方法

2017-12-13 15:41:13.486047-0500 HellowWorld[466:85961] [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert
2017-12-13 15:41:13.486363-0500 HellowWorld[466:85961] [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert

Screenshot added

60
Jason Duan

メッセージが表示される理由をデバッグできる方法はありますか。

はい、がありますが、まだ言及されていないことに少し驚いています。

CFNetworkは、Foundationのネットワーククラスの中核を処理します - CFNETWORK_DIAGNOSTICS環境変数による詳細なロギングの(見過ごされがちな)機能もあります。

プログラム的にCFNetwork診断ログを有効にする:

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);

0から3までの整数値に設定する必要があります。0はオフで、数値が大きいほど徐々にログ記録が増えます。通常の開発中は、Xcodeのスキームエディタを使ってこの環境変数を設定できます。アプリケーションがXcodeから実行されると、CFNetworkログエントリがデバッグコンソール領域に表示されます(表示されていない場合はView> Debug Area> Show Debug Areaを選択します)。

環境変数はアプリの起動シーケンスの最初に配置する必要があります。通常、これをmainの先頭に置くだけで十分ですが、CFNetworkを使用するC++スタティックイニシャライザがある場合は、それらの前に配置する必要があります。

注:Swiftでは、このコードはmain.Swiftに入ります。デフォルトでは、Swiftアプリケーションはmain.Swiftを持っていません。追加方法については、「The Swift Programming Language」を参照してください。
*また、Swiftではsetenvの最後にあるセミコロンを削除してください。

上記の環境変数を設定すると、問題がどこにあるのかを判断するのに確実に役立つはずです。あるいは少なくとも漠然としたエラーメッセージの診断を始めるための出発点を教えてください。

Net CFNetwork診断ログ

21
l'L'l

Info.plistに "App Transport Security Settings"キーを追加して問題を解決しました。 [Allow Arbitrary Loads]が[Yes]に設定されていることを確認してください。

0
AndyC

上記の方法がうまくいかなかったあなた方のために、これは私の場合に問題があったものです:

私は Alamofire を使用してJSONリクエストボディGETリクエストを送信していました。代わりにURLのクエリパラメータとしてパラメータを含むGETリクエストに変更しました(GET https://your-api.com/v1/request?param=valueの行に沿って)。それからそれは完璧に働いた。

0