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ロードに失敗しました
解決策が見つかりました:
IOS 9では、ATSはHTTPSの使用を含む、ネットワーク通話中のベストプラクティスを実施します。
ATSは偶発的な開示を防ぎ、安全なデフォルトの動作を提供し、そして採用が容易です。新しいアプリを作成するのか既存のアプリを更新するのかにかかわらず、ATSをできるだけ早く採用する必要があります。新しいアプリを開発している場合は、HTTPSのみを使用してください。既存のアプリがある場合は、今すぐできる限りHTTPSを使用し、残りのアプリをできるだけ早く移行するための計画を立てる必要があります。
ベータ1では、現在info.plistでこれを定義する方法はありません。解決策は手動で追加することです。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
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>
IOS9でSSLを処理する方法、1つの解決策は次のようにすることです。
Apple が言うように、
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 を参照してください。
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>
あなたが私のように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
私はここで から解決策を見つけました。 そしてそれは私のために働いています。
これを確認してください、それはあなたを助けるかもしれません。
<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>
更新:
Xcode 7.1では、info.plist
にNSAppTransportSecurity
辞書を手動で入力する必要はありません。
それは今あなたのためにオートコンプリートし、それが辞書であることを理解し、そしてそれからAllows Arbitrary
Loadsもオートコンプリートします。 info.plistスクリーンショット
NSURLConnection HTTPロードのバグを解決するinfo.plistに以下のDictを追加するだけです。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
これは私がこのエラーを経験したときに私のために働いていたものです:
<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>
この機能をRCTHTTPRequestHandler.mファイルに追加してみてください。
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }
上記の回答に加えて、あなたのURLを再確認してください
Info.plistにキーを追加して解決しました。私が従った手順は次のとおりです。
プロジェクトのinfo.plistファイルを開きました
辞書としてNSAppTransportSecurityというキーを追加しました。
次の図のように、NSAllowsArbitraryLoadsというサブキーをブール値として追加し、その値をYESに設定します。ここに画像の説明を入力してください
プロジェクトをきれいにして今、すべてが以前と同じように問題なく実行されています。