web-dev-qa-db-ja.com

iOS 9でNSURLSession / NSURLConnection HTTPロードが失敗しました

IOS9上で私の既存のアプリを実行しようとしましたが、AFURLSessionManagerを使用している間失敗しました。

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

次のようなエラーが表示されます。

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

以下のログも取得します。

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

更新:私のソリューションに複数の更新を追加しました: iOS 9でNSURLSession/NSURLConnection HTTPロードに失敗しました

135
Tariq

解決策が見つかりました:

IOS 9では、ATSはHTTPSの使用を含む、ネットワーク通話中のベストプラクティスを実施します。

アップルのドキュメントから:

ATSは偶発的な開示を防ぎ、安全なデフォルトの動作を提供し、そして採用が容易です。新しいアプリを作成するのか既存のアプリを更新するのかにかかわらず、ATSをできるだけ早く採用する必要があります。新しいアプリを開発している場合は、HTTPSのみを使用してください。既存のアプリがある場合は、今すぐできる限りHTTPSを使用し、残りのアプリをできるだけ早く移行するための計画を立てる必要があります。

ベータ1では、現在info.plistでこれを定義する方法はありません。解決策は手動で追加することです。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

enter image description here

Update1:​​これは、iOS9 ATSを採用する準備が整うまでの一時的な回避策です。サポートしています。

Update2:詳細については、次のリンクを参照してください。 http://ste.vn/2015/06/10/configuring-app-transport -security-ios-9-osx-10-11 /

Update3:TLS 1.0しか持たないホスト(YOURHOST.COM)に接続しようとしている場合

これらをアプリのInfo.plistに追加してください。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
239
Tariq

IOS9でSSLを処理する方法、1つの解決策は次のようにすることです。

Apple が言うように、 enter image description hereenter image description here

enter image description here

iOS 9およびOSX 10.11では、アプリのInfo.plistファイルで例外ドメインを指定しない限り、データを要求する予定のすべてのホストにTLSv1.2 SSLが必要です。

Info.plist構成の構文は次のとおりです。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

あなたのアプリケーション(例えばサードパーティのウェブブラウザ)が任意のホストに接続する必要があるなら、あなたはこれをこのように構成することができます:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

これを行う必要がある場合は、TLSv1.2とSSLを使用するようにサーバーを更新することをお勧めします(まだ使用していない場合)。これは一時的な回避策と考えるべきです。

本日現在、プレリリース版のドキュメントでは、これらの構成オプションについて具体的な言及はありません。完了したら、回答を更新して関連ドキュメントにリンクします。

詳しくは、 iOS9AdaptationTips を参照してください。

53
ElonChan

AppleのApp Transport Securityに関するTechnoteは非常に便利です 。それは私達が私達の問題にもっと安全な解決策を見つけるのを助けました。

うまくいけば、これは他の誰かに役立つでしょう。完全に有効と思われるAmazon S3 URL、TLSv12 HTTPS URLへの接続に問題がありました。 S3が使うもう一握りの暗号を有効にするにはNSExceptionRequiresForwardSecrecyを無効にする必要がありました。

私たちのInfo.plistで:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>
39
Ben Kreeger

あなたが私のようにAmazon S3でこの問題を抱えているなら、あなたのトップレベルタグの直接の子としてあなたのinfo.plistにこれを貼り付けてみてください。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

あなたはより多くの情報を見つけることができます:

http://docs.aws.Amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue

6
David Cespedes

私はここで から解決策を見つけました。 そしてそれは私のために働いています。

これを確認してください、それはあなたを助けるかもしれません。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.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>
4
Ashvin Ajadiya

.plistファイルに次のフィールドを追加するだけです。

enter image description here

構文は次のようになります。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
3
geet Sebastian

更新:

Xcode 7.1では、info.plistNSAppTransportSecurity辞書を手動で入力する必要はありません。

それは今あなたのためにオートコンプリートし、それが辞書であることを理解し、そしてそれからAllows Arbitrary Loadsもオートコンプリートします。 info.plistスクリーンショット

1
Ben

NSURLConnection HTTPロードのバグを解決するinfo.plistに以下のDictを追加するだけです。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>
1
Sakir Sherasiya

これは私がこのエラーを経験したときに私のために働いていたものです:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>
0
KVISH

この機能をRCTHTTPRequestHandler.mファイルに追加してみてください。

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }

0
eliprodigy

上記の回答に加えて、あなたのURLを再確認してください

0
Vaishnavi

Info.plistにキーを追加して解決しました。私が従った手順は次のとおりです。

プロジェクトのinfo.plistファイルを開きました

辞書としてNSAppTransportSecurityというキーを追加しました。

次の図のように、NSAllowsArbitraryLoadsというサブキーをブール値として追加し、その値をYESに設定します。ここに画像の説明を入力してください

プロジェクトをきれいにして今、すべてが以前と同じように問題なく実行されています。

参照リンク: https://stackoverflow.com/a/32609970

0
tania_S