info.plist
次のエラー メッセージに従って HTTP モードを有効にするには、どのような設定を行う必要がありますか?
安全でないため、トランスポート セキュリティはクリアテキスト HTTP (http://) リソースのロードをブロックしました。一時的な例外は、アプリの Info.plist ファイルを介して構成できます。
私のドメインがexample.com
.
info.plist
次のエラー メッセージに従って HTTP モードを有効にするには、どのような設定を行う必要がありますか?
安全でないため、トランスポート セキュリティはクリアテキスト HTTP (http://) リソースのロードをブロックしました。一時的な例外は、アプリの Info.plist ファイルを介して構成できます。
私のドメインがexample.com
.
Xcode 8.0+ および Swift 2.2+ または Objective C を使用している場合:
任意のサイトへの HTTP 接続を許可する場合は、次のキーを使用できます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
追加するために接続するドメインがわかっている場合:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
これは、これを plist に追加するための簡単な回避策です (ただし、推奨されません)。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
つまり(Appleのドキュメントによると):
NSallowArbitraryLoads
NSExceptionDomains ディクショナリにリストされていないドメインの App Transport Security を無効にするために使用されるブール値。リストされたドメインは、そのドメインに指定された設定を使用します。NO のデフォルト値では、すべての接続に対してデフォルトの App Transport Security 動作が必要です。
私は本当にリンクをお勧めします:
理由とすべての意味を理解するのに役立ちます。
以下の XML (ファイル Info.plist 内) は次のようになります。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
すべてのページに対して任意の呼び出しを禁止しますがPAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE
、接続で HTTP プロトコルを使用することを許可します。
上記の XML に以下を追加できます。
<key>NSIncludesSubdomains</key>
<true/>
指定したアドレスのサブドメインに対して安全でない接続を許可する場合。
最善の方法は、すべての任意の読み込みをブロックし (false に設定)、例外を追加して、問題がないことがわかっているアドレスのみを許可することです。
2018 アップデート:
Apple はこれをオフにすることを推奨していません - 詳細については、207 セッション WWDC 2018を参照してください。
歴史的な理由と開発段階で元の答えを残す
修正方法に加えて、なぜこれが起こっているのかについてより多くのコンテキストが必要な場合は、以下をお読みください.
iOS 9 の導入により、アプリと Web サービス間の接続のセキュリティを向上させるために、アプリとその Web サービス間の安全な接続はベスト プラクティスに従う必要があります。ベスト プラクティスの動作は、App Transport Securityによって次のように適用されます。
App Transport Security Technoteで説明されているように、Web サービスと通信する場合、App Transport Security には次の要件と動作があります。
- サーバーは少なくとも Transport Layer Security (TLS) プロトコル バージョン 1.2 をサポートしている必要があります。
- 接続暗号は、前方秘匿性を提供するものに限定されます (以下の暗号のリストを参照してください)。
- 証明書は、2048 ビット以上の RSA キーまたは 256 ビット以上の楕円曲線 (ECC) キーを使用して、SHA256 以上の署名ハッシュ アルゴリズムを使用して署名する必要があります。
- 証明書が無効な場合、ハード エラーが発生し、接続できなくなります。
つまり、Web サービス要求は、a.) HTTPSを使用し、b.) TLS v1.2 と前方秘匿性を使用して暗号化する必要があります。
ただし、他の投稿で述べたように、アプリの で安全でないドメインを指定することにより、App Transport Security からこの新しい動作をオーバーライドできますInfo.plist
。
NSAppTransportSecurity
オーバーライドするには、 >NSExceptionDomains
辞書のプロパティをに追加する必要がありますInfo.plist
。NSExceptionDomains
次に、Web サービスのドメインをディクショナリに追加します。
たとえば、ホストwww.yourwebservicehost.com上の Web サービスに対して App Transport Security の動作をバイパスする場合は、次のようにします。
Xcode でアプリを開きます。
Project Navigator でファイルを見つけてInfo.plist
右クリックし、[ Open As ] > [ Source Code ] メニュー オプションを選択します。プロパティ リスト ファイルが右側のペインに表示されます。
次のプロパティ ブロックをメインのプロパティ ディクショナリ内 (最初の の下<dict>
) に配置します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
追加のドメインに例外を提供する必要がある場合は、下に別のディクショナリ プロパティを追加しますNSExceptionDomains
。
上記のキーの詳細については、既に言及されているこの技術情報をお読みください。
これには 2 つの解決策があります。
ソリューション 1 :
Info.plist
辞書を追加しますNSAppTransportSecurity
'Allow Arbitrary Loads'
Plist
下の画像のように構造が表示されます。
解決策 2 :
Info.plist
辞書を追加しますNSAppTransportSecurity
NSExceptionDomains
キー ' 'を持つ辞書内に別の要素を追加します'MyDomainName.com'
タイプ NSDictionary のキーを持つ要素を追加しますNSIncludesSubdomains
タイプのキー ' 'Boolean
と値が として設定された要素を追加しますYES
NSTemporaryExceptionAllowsInsecureHTTPLoads
タイプのキー ' 'Boolean
と値が として設定された要素を追加しますYES
Plist
下の画像のように構造が表示されます。
ソリューション 2 は、選択したドメインのみを許可するため、ソリューション 1 は安全でない HTTP 接続をすべて許可するため、推奨されます。
トランスポート セキュリティは、iOS 9.0 以降で使用できます。アプリケーション内で WS を呼び出そうとすると、次の警告が表示される場合があります。
アプリケーション トランスポート セキュリティは、セキュリティで保護されていないため、平文の HTTP (http://) リソースの読み込みをブロックしました。一時的な例外は、アプリの Info.plist ファイルを介して構成できます。
Info.plist に以下を追加すると、ATS が無効になります。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Apple によると、通常、ATS を無効にすると、正当な理由がない限り、アプリが拒否されます。その場合でも、安全にアクセスできるドメインの例外を追加する必要があります。
Apple には、使用する設定を正確に指示する優れたツールがあります。ターミナルで、次のように入力します。
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
nscurl は、このリクエストが失敗したかどうかを確認し、さまざまな設定を試して、どれが成功し、何をすべきかを正確に伝えます。たとえば、私がアクセスしたサードパーティの URL について、このコマンドは、この辞書が合格することを教えてくれました。
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
独自のサイトと制御できないサードパーティのサイトを区別するには、たとえば、キー NSThirdPartyExceptionRequiresForwardSecrecy を使用します。
注: plist の例外ドメインは小文字にする必要があります。
例: [設定] -> [共有] でマシンに「MyAwesomeMacbook」という名前を付けました。サーバー (テスト用) は MyAwesomeMacbook.local:3000 で実行されており、アプリはhttp://MyAwesomeMacbook.local:3000/filesにリクエストを送信する必要があります。 local" を例外ドメインとして指定します。
--
あなたの info.plist には...が含まれます
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>myawesomemacbook.local</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
そこへの行き方について言及する価値があるかもしれません...
Info.plist は、Main.storyboard または viewController.swift の下にあるファイルの 1 つです。
最初にクリックすると、通常は表形式になっているので、ファイルを右クリックしてソースコードとして「開く」し、最後に以下のコードを追加します。
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
すぐ上のコードをコピーして貼り付けます
"</dict>
</plist>"
これは最後にあります。
WKWebView が常に白く、何もロードされない理由を見つけようとしてここに来た人のために (正確にここで説明されているように、WKWebView を迅速かつ macOS アプリで動作させるにはどうすればよいですか) :
上記のすべてのロケット科学がうまくいかない場合は、明白なことを確認してください: サンドボックスの設定
Swiftとcocoaは初めてですが、プログラミングの経験はかなりあるので、このソリューションを見つけるのに約20時間を費やしました. 何十もの流行に敏感な iOS チュートリアルやアップルの基調講演のどれも、この小さなチェックボックスについて言及しているものはありません。
デフォルトでは、iOS は HTTPS API のみを許可します。HTTP は安全ではないため、アプリ トランスポート セキュリティを無効にする必要があります。ATS を無効にする方法は 2 つあります。
1. プロジェクト info.plist にソース コードを追加し、ルート タグに次のコードを追加します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2. プロジェクト情報を使用する。
左ペインのプロジェクトでプロジェクトをクリックし、プロジェクトをターゲットとして選択し、情報タブを選択します。次の構造に辞書を追加する必要があります。
Cordova の場合、ios.json に追加する場合は、次の手順を実行します。
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
}
]
そして、それは次の中にある必要があります:
"*-Info.plist": {
"parents": {
}
}