App Transport Securityポリシーで安全な接続を使用する必要があるため、リソースを読み込めませんでした


492

Xcodeを7.0またはiOS 9.0にアップデートすると、問題が発生します。どういうわけかそれは私にタイトル付きエラーを与え始めました

「App Transport Securityポリシーでは安全な接続を使用する必要があるため、リソースを読み込めませんでした」

Webserviceメソッド:

-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setAllowsCellularAccess:YES];
    [sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
    NSLog(@"URl %@%@",url,DataString);
    // Configure the Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
    request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPMethod = @"Post";

    // post the request and handle response
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                          {
                                              // Handle the Response
                                              if(error)
                                              {
                                                  NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);

                                                  // Update the View
                                                  dispatch_async(dispatch_get_main_queue(), ^{

                                                      // Hide the Loader
                                                      [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES];


                                                  });
                                                  return;
                                              }
                                              NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL];
                                              for (NSHTTPCookie * cookie in cookies)
                                              {
                                                  NSLog(@"%@=%@", cookie.name, cookie.value);
                                                  strSessName=cookie.name;
                                                  strSessVal=cookie.value;

                                              }

                                              NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];
[postDataTask resume];

}

Xcode以前のバージョンとiOS以前のバージョンでサービスは正常に動作していますが、iOS 9.0上のXcode 7.0に更新すると、上記のWebサービスメソッドを呼び出すと、次のような問題が発生し始めました。私が得ているログに記録されたエラーは:

接続に失敗しました:エラードメイン= NSURLErrorDomainコード= -1022「App Transport Securityポリシーでは安全な接続を使用する必要があるため、リソースをロードできませんでした。」UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork Code = -1022 "(null)"}、NSErrorFailingURLStringKey = MyServiceURL、NSErrorFailingURLKey = MyServiceURL、NSLocalizedDescription =アプリトランスポートセキュリティポリシーで安全なものを使用する必要があるため、リソースをロードできませんでした接続。}

以下の質問と回答を試してみましたが、結果が得られませんでした。サービスコールエラーを削除する方法を事前に教えてください。

  1. リソースを読み込めませんでしたios9
  2. App Transport Security Xcode 7ベータ6
  3. https://stackoverflow.com/a/32609970

回答:


935

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

  1. プロジェクトターゲットのinfo.plistファイルを開いた

  2. と呼ばNSAppTransportSecurityれるキーを追加しましたDictionary

  3. NSAllowsArbitraryLoadsas というサブキーを追加し、次の図のようにBooleanその値を設定しますYES

ここに画像の説明を入力してください

プロジェクトをクリーンアップすると、以前と同様にすべてが正常に実行されます。

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

編集: またはinfo.plistファイルのソースコードでそれを追加できます:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
  </dict>

5
最初は機能しません。Project> Targetにもキーを追加する必要があります
orafaelreis '19

4
ここにいくつかの役立つAppleドキュメントdeveloper.apple.com/library/ios/documentation/General/Reference/…があり
LargeGlasses

1
@MihirOza:うん、トランスポート・セキュリティは、iOSの9の新機能である
ドミニク・K

2
例外ドメインがない場合は、でキーを削除してくださいNSExceptionDomains。それ以外の場合はの例外とNSAllowArbitraryLoadsなります。httpsを使用してこれにアクセスする必要がありますexception
DawnSong

7
Xcodeの8.3 /スイフト3ことがあるApp Transport Security SettingsAllow Arbitrary Loads、それぞれ
Swapna Lekshmanan

280

NSAllowsArbitraryLoads = trueプロジェクトので使用すると、info.plist任意のサーバーへのすべての接続が安全でなくなることに注意してください。安全でない接続を介して特定のドメインのみがアクセス可能であることを確認したい場合は、これを試してください:

ここに画像の説明を入力してください

または、ソースコードとして:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>domain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

編集後、プロジェクトをクリーン&ビルドします。


あなたの答えに感謝NSAllowArbitaryLoadsは私のためにうまくいきませんでしたNSExceptionAllowsInsecureHTTPLoadsを追加するとうまく
いきました

1
また、次の2つのキーを追加しました:<!-Include to HTTP HTTP requests-> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </ key> <true /> <!-Include to minimum TLS version-> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </ string> LOTの読み込みも速くなりました。
Sandy D.

注:現在XCode 8を使用しています。これを手動で行う場合は、ドメインを右クリックし、[値のタイプ]> [辞書]を追加して、「.. AllowsInsecure ...」と「... IncludesSubdomains」を追加してください
ArielSD

domain.comの後にポート番号を指定すると機能しません。(domain.com:3001など)
Shamsiddin

43

トランスポートセキュリティは、iOS 9.0以降、およびOS X v10.11以降で提供されます。

したがって、デフォルトでは、https呼び出しのみがアプリでのみ許可されます。App Transport Securityをオフにするには、info.plistファイルに次の行を追加します...

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

詳細:https :
//developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


しかし、これではまだどのドメインに対してもHTTP呼び出しを行うことができません。なぜそれが起こっているのか手掛かりはありますか?
Mrug

そのHTTP URLであっても、URLは検証されるか、vlid SSL証明書が必要です。
Teja Kumar Bethina

35

iOS 10.xおよびSwift 3.x [以下のバージョンもサポートされています]の場合は、「info.plist」に次の行を追加してください。

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

1
10.xとSwift 3.xの場合、他の場所で、キーが実際にはAppTransportSecurityとAllowsArbitraryLoadsであるのを見ましたが、それらは間違っていました。Swift 3.xの場合でも、これらのキーにはNSプレフィックスが必要です。これらのキーにNSプレフィックスを使用すると、エラーはなくなりました。
Jazzmine 2017

27

Swift 4では

-> Go Info.plist

->情報プロパティリストのプラスをクリック

-> App Transport Security設定を辞書として追加

->プラスアイコンをクリックしますApp Transport Security Settings

-> Add Allow Arbitrary LoadsセットYES

怒鳴る画像はこんな感じ

ここに画像の説明を入力してください


23

plistファイルとして解決しました。

NSAppTransportSecurity:辞書を追加します。

"NSAllowsArbitraryLoads"という名前のサブキーをブール値として追加します:YES

ここに画像の説明を入力してください


18

App Transport SecurityポリシーではSwift 4.03で機能する安全な接続を使用する必要があるため、リソースを読み込めませんでした。

ソースコードとしてpList.infoを開き、貼り付けます。

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

13

Appleのドキュメントから

新しいアプリを開発している場合は、HTTPSのみを使用する必要があります。既存のアプリがある場合は、できる限りすぐにHTTPSを使用し、アプリの残りの部分をできるだけ早く移行するための計画を作成する必要があります。さらに、上位レベルのAPIを介した通信は、TLSバージョン1.2を使用して暗号化され、転送秘密が必要です。この要件に従わない接続を確立しようとすると、エラーがスローされます。アプリが安全でないドメインにリクエストを行う必要がある場合は、アプリのInfo.plistファイルでこのドメインを指定する必要があります。

App Transport Securityをバイパスするには:

<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>

安全でないドメインをすべて許可するには

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

詳細:iOS 9およびOSX 10.11でのApp Transport Security例外の構成




9

これは、APIにセキュリティを強化するAppleの方法です(httpよりもhttpsを使用することを強制されます)。このセキュリティ設定を削除する方法を説明します。


ここでのほとんどの回答は、このキーをinfo.plistに追加することを指摘しています ここに画像の説明を入力してください

これだけではこの問題を解決できませんでした。内部に同じキーを追加する必要がありました

Project -> Targets -> Info -> Custom iOS Target Properties ここに画像の説明を入力してください


これにより、安全でない接続が誰からでも発生する可能性があります。特定のドメインのみが安全でない接続を使用できるようにする場合は、info.plistに以下を追加できます。

ここに画像の説明を入力してください


ありがとう、これでうまくいきました!以前は機能しなかったplistファイルのみを編集しました。私は他の人がそれをそのように機能させたのに驚いた
ジョーンズ

8

あなたはあなたのURLでHTTPSではなくHTTPSを使う必要があるだけでそれは機能します


3
もちろん、Appleは自己署名証明書を好まないためHTTPSを使用できません。その問題はありませんか?
トニーB

1
私の場合、HTTPSに変更してから完全に機能します
pierre23

1
しかし、自己署名証明書またはCA署名証明書を使用していますか?ちょっと興味があるんだけど。もちろん、別の問題のようですが、私が尋ねると思いました。
トニーB

私はサーバー側で働いていませんでした、正直であるかわかりません:(
pierre23

一部のサーバー環境(共有ホスティング)でHTTPS接続を設定するのは難しい場合があります。
ラプター


5

iOS 9は、開発者にApp Transport Securityのみの使用を強制します(5月)。私はこれをどこかでランダムに耳にしたので、これが本当かどうかはわかりません。しかし、私はそれを疑い、この結論に達しました:

iOS 9で実行されているアプリは、(おそらく)SSLなしでMeteorサーバーに接続しなくなります。

つまり、meteor run iosまたはmeteor run ios-deviceを実行すると(おそらく?)機能しなくなります。

アプリのInfo.plistでは、NSAppTransportSecurity [Dictionary]キーは持っている必要がありますNSAllowsArbitraryLoads [Boolean]に設定するYESか、流星を使用する必要がありhttps、そのためにlocalhost serverすぐに。


5

Xcode 8.0から8.3.3およびSwift 2.2から3.0を使用している場合

私の場合、URL http://https://に変更する必要があります (機能しない場合は試してください)

Add an App Transport Security Setting: Dictionary.
Add a NSAppTransportSecurity: Dictionary.
Add a NSExceptionDomains: Dictionary.
Add a yourdomain.com: Dictionary.  (Ex: stackoverflow.com)

Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES

ここに画像の説明を入力してください


3

pList.infoソースコードとして開き、下部で</dict>次のコードを追加する直前に、

 <!--By Passing-->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.domain.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>
    <!--End Passing-->

そして最後your.domain.comに、ベースURLで変更します。ありがとう。


3

localhostで開発している場合は、次の手順に従ってください。

  1. 横の「+」ボタンをタップして、タイプInformation Property Listを追加App Transport Security Settingsして割り当てますDictionary
  2. 新しく作成されたApp Transport Security Settingsエントリの横にある「+」ボタンをタップしてNSExceptionAllowsInsecureHTTPLoadsタイプBooleanを追加し、その値をに設定しますYES
  3. NSExceptionAllowsInsecureHTTPLoadsエントリを右クリックし、[Shift Row Right]オプションをクリックして、上記のエントリの子にします。
  4. NSExceptionAllowsInsecureHTTPLoadsエントリの横にある「+」ボタンをタップしてAllow Arbitrary LoadsタイプBooleanを追加し、その値をYES

注:最終的には次の図のようになります。

ここに画像の説明を入力してください


2

上記のオプションの多くを組み合わせることで、これをなんとか解決しました。これを機能させるために必要なすべてのチェックリストを含めます。

要するに:

  1. NSAllowsArbitraryLoads時計の拡張機能(時計アプリではない)をtrueに設定します。
  2. 私が使用httpsしていたことを確認してくださいhttp

第一歩:

最初に、そして最も明白に、ブール値として呼び出されるサブキーをtrueに設定して、NSAppTransportSecurityキーを辞書の拡張機能の辞書として追加する必要がありました。これはWatch拡張機能でのみ設定し、Watchアプリのplistでは設定しないでください。ただし、これはすべての接続を許可し、安全でない可能性があることに注意してください。info.plistNSAllowsArbitraryLoads

ここに画像の説明を入力してください

または

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

ステップ2:

次に、ロードしようとしたURLがhttpsだけでなく、であることを確認する必要がありましたhttp。まだhttpだったURLについては、次のように使用しました。

スウィフト

let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")

Obj-C:

NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];


2

正しいinfo.plistファイルを変更してください

MyProjectNameUITestsの下のinfo.plistを変更していることに気付かなかったため、この問題に時間を費やすのは2回目です。


1

firebaseを使用するNSAllowsArbitraryLoadsInWebContent = trueと、NSAppTransportSecurityセクションに追加され、機能しNSAllowsArbitraryLoads = trueなくなります


この情報をありがとう。トラブルシューティングの時間を節約できました。
pAkY88

0

「NSAllowsArbitraryLoads」オプションではなく、1年間の署名付き証明書を使用する自己ホスト型解析サーバーの場合、この問題を解決しました

node.jsサーバーとしてサーバーを解析すると、指定する必要があるパブリックhttps URLが表示されます。例えば:

parse-server --appId --masterKey --publicServerURL https://your.public.url/some_nodejs

設定ファイルを自由に見てください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.