簡単なプログラム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
メッセージが表示される理由をデバッグできる方法はありますか。
はい、がありますが、まだ言及されていないことに少し驚いています。
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診断ログ
Info.plistに "App Transport Security Settings"キーを追加して問題を解決しました。 [Allow Arbitrary Loads]が[Yes]に設定されていることを確認してください。
上記の方法がうまくいかなかったあなた方のために、これは私の場合に問題があったものです:
私は Alamofire を使用してJSONリクエストボディでGET
リクエストを送信していました。代わりにURLのクエリパラメータとしてパラメータを含むGET
リクエストに変更しました(GET https://your-api.com/v1/request?param=value
の行に沿って)。それからそれは完璧に働いた。