既存のプロジェクトをiOS 9にアップグレードしてから、エラーが発生し続けます。
SSLエラーが発生し、サーバーへの安全な接続を確立できません。
IOS9の場合、AppleはiOS 9で根本的な決断を下し、 App Transport Security(ATS) の一部としてiOSアプリからの保護されていないHTTPトラフィックをすべて無効にしました。
単純にATSを無効にするには、openInfo.plistと入力して次の行を追加します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
任意のロードを許可すること(NSAllowsArbitraryLoads = true
)がよい回避策ですが、ATSを完全に無効にするのではなく、許可するHTTP接続を有効にする必要があります。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
iOS 9では、最近の脆弱性を回避するために、HTTPSを使用している接続がTLS 1.2になるように強制されています。 iOS 8では、暗号化されていないHTTP接続さえサポートされていたので、古いバージョンのTLSも問題を起こしませんでした。回避策として、このコードスニペットをInfo.plistに追加します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
特定のドメインのみをターゲットにしている場合は、これを試してアプリケーションのInfo.plistに追加できます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
IOS 9.0.2は有効なHTTPSエンドポイントへの要求を中断しているようです。私の現在の疑いは、それがSHA-256証明書を必要としているか、それがこのエラーで失敗するということです。
再現するには、SafariでUIWebViewを調べて、任意のHTTPSエンドポイントに移動してみます。
location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)
今すぐGoogleにアクセスしてみてください(もちろん、彼らはSHA-256証明書を持っています)。
location.href = "https://google.com"
// no problemo
トランスポートセキュリティに例外を追加すると(上記の@stéphane-bruckertの回答で概説されているように)、これを修正できます。また、NSAppTransportSecurity
を完全に無効にすることでもうまくいくと思いますが、完全に無効にするとアプリのレビューが危険にさらされる可能性があることを私は読んでいます。
[編集] NSExceptionDomains
をtrueに設定したままでも、接続しているドメインをNSExceptionAllowsInsecureHTTPLoads
辞書に列挙するだけでこの問題が解決することがわかりました。 :\
HTTPS URLを https://www.mywebsite.com のように指定した場合も同じエラーが発生します。ただし、3つのWを指定せずに指定すると、正常に動作します。 https://mywebsite.com 。
問題はサーバー側のSSL証明書です。何かが干渉しているか、証明書がサービスと一致しません。たとえば、サイトがwww.mydomain.comのSSL証明書を持っているときに、使用するサービスがmyservice.mydomain.comで実行されているとします。それは違うマシンです。
Xcodeプロジェクト - > goto info.plistをクリックしてから追加(App Transport Security Settings)をクリックし、展開して任意の負荷を許可YESを設定します。ありがとう
私の問題はNSURLConnection
で、それはiOS9で廃止予定だったので、私はすべてのAPIをNSURLSession
に変更し、それが私の問題を修正しました。
私の場合、私のコンピューターの日付が現在の日付より遅れているため、私はシミュレーターでこの問題に直面しました。あなたがSSLエラーに直面したときにもこのケースをチェックしてください。