web-dev-qa-db-ja.com

AFNetworking-HTTPロードに失敗しました(エラーコード:-999)Swift iOS

IOS 11でAFNetworkingを使用しています。次のようなエラーが表示されます。

タスク<2EC9C49F-1889-4BFF-83B4-2047ED6E5F2A>。<1> HTTPロードに失敗しました(エラーコード:-999 [1:89])エラー(countries.php):エラーDomain = NSURLErrorDomain Code = -999 "キャンセル" UserInfo = {NSErrorFailingURLStringKey = https://www.plrc.us/api/countries.php 、NSLocalizedDescription = cancelled、NSErrorFailingURLKey = https://www.plrc.us/api/countries .php }

私はすべての可能な方法を試しました。

info.plist

これを解決するのを手伝ってください。

ありがとうございました

7
Riddhi Shah

いくつかの、マイナーな、無関係な問題があります。

  1. NSExceptionAllowsInsecureHTTPLoadsは文字列ではなくブール値でなければなりません。

  2. WebサービスはJSONを返しますが、Content-Type なので text/html。ただし、AFNetworking(およびそのSwifty兄弟、Alamofire)は、Content-Type HTTPヘッダー。

    AFNetworkingを使用している場合、これはおそらくtext/htmlAFJSONResponseSerializerの許容コンテンツタイプのリストに追加します。 (または、AFHTTPResponseSerializerを使用できますが、JSONを自分で解析する必要があります。)

しかし、これらはどちらもNSURLErrorCancelledのソースではない可能性があります。この「キャンセルされた」エラーを受け取ることなく、iOSからこのWebサービスを照会することができました(plistの設定があり、plistネットワーク関連の設定がまったくありません)。

コンピューターまたはネットワークに何らかの構成上の問題があるのではないかと思います。これをシミュレータではなく物理デバイスでテストしてみます。 (これにより、問題の原因となる可能性のあるコンピューター構成が排除されます。)それが機能する場合は、Wi-Fiではなく、セルラー接続でテストしてみます。 (これにより、問題の原因としてのLANの構成、たとえばプロキシサーバーの奇妙な部分がなくなります。)

AFNetworkingでは、デフォルトの認証チャレンジルーチンは、NSURLSessionAuthChallengeCancelAuthenticationChallengeを完了ハンドラー URLSession:didReceiveChallenge:completionHandler: 。結果はNSURLErrorCancelledになります。ただし、標準のシステム構成ではこれはトリガーされません。しかし、AFURLSessionManagerでこの認証チャレンジをトリガーするコンピューターまたはネットワークについて何かがある場合。

たとえば、 Charles を使用し、Charles Root Certificateを無効にすると、この種の非啓発的な「キャンセル」エラーが発生したときに、問題を再現できました。私の特定の例では、チャールズの「ヘルプ」"「SSLプロキシ」"「iOSシミュレーター用のチャールズルート証明書のインストール」を介して、チャールズがSSLを信頼するようにシミュレーターを設定したら。これがあなたの場合の正確な問題だとは言っていませんが(これはCharlesのユーザーに固有です)、認証チャレンジをトリガーする可能性のある広範なクラスの問題の例であり、AFNetworkingがチャレンジをキャンセルして、 NSURLErrorCancelled

要するに、リモートサーバーに接続しようとしている構成を変更してみて、問題を顕在化させない構成や他の構成を特定できるかどうかを確認してください。

4
Rob

概念実証の開発中にこの問題に遭遇し、サーバーに適切な証明書がありませんでした。これに関連するほとんどの質問はAFNetworking 1および2を使用することに関するもので、AFNetworking 3ではほとんどの回答が.plist

私のために働いたのは、AFSecurityPolicy *securityPolicy; そのようです:

AFSecurityPolicy *sec = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
[sec setAllowInvalidCertificates:YES];
[sec setValidatesDomainName:NO];
manager.securityPolicy = sec;

Dody Rachmat Wicaksono's answer here。 に感謝します

その質問のOPが回答をSwiftに投稿しました。

注:これと同様の他の回避策と同様に、これは実稼働環境で使用することを意図したものではありません。

2
Tyler927