【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)

【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)

この記事からわかること

  • SwiftWebサイトiOSアプリから開く方法
  • WKWebViewクラスの使い方
  • HTTP通信許可するには?
  • ATS(App Transport Security)とは?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

公式リファレンス:App Transport Security設定の最適化

ATSの導入でiOSアプリではHTTP通信ができない

iOS9以降から「ATS(App Transport Security)」が導入されたことによりHTTP通信ができなくなりました。これはアプリとインターネット間のデータ通信をより安全にするための仕組みで、基本的にHTTPS通信しか許可しないようになっています。

そのためWKWebViewURLSessionなどインターネットに関わる部分に影響してくる変更です。

WKWebView

URLSession

HTTP通信を行おうとすると以下のようなエラーが発生し接続自体ができないようになっています。

Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={networkTaskMetricsPrivacyStance=Unknown, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <CE39C8F7-6611-499E-B40A-8DC87B87A157>.<2>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <CE39C8F7-6611-499E-B40A-8DC87B87A157>.<2>"
), NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection., _WKRecoveryAttempterErrorKey=<WKReloadFrameErrorRecoveryAttempter: 0x60000027ef60>, networkTaskDescription=LocalDataTask <CE39C8F7-6611-499E-B40A-8DC87B87A157>.<2>, NSErrorFailingURLStringKey=http://appdev-room.com/, NSUnderlyingError=0x600000c7fc90 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLKey=http://appdev-room.com/}

HTTP通信を許可するには?

iOSアプリでHTTP通信が完全に禁止されたわけではなく逃げ道が用意されていました。方法は「info.plist」の中に該当のキーを追加するだけです。その中でもざっくり分けて2つ方法があります。

全てのHTTP通信を許可する

1つ目の方法は全てのHTTP通信を許可する方法です。「info.plist」にNSAppTransportSecurityを追加しその中のNSAllowsArbitraryLoadsYESを渡します。

NSAppTransportSecurityHTTP接続関連のセキュリティ設定を行うルートのキーNSAllowsArbitraryLoads全ての通信に対してATSが無効になっているかどうかを示すフラグです。

【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)

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

NSAllowsArbitraryLoadsYESにしてアプリを申請する場合は正当な理由が必要になるようです。

この実装の場合は全ての通信でHTTP通信が可能になってしまうので安全面が少し心配になってしまいます。それを解決するのが2つ目の方法です。

ドメイン指定でHTTP通信を許可する

HTTP通信を許可するドメインを指定して設定することも可能になっています。同じくNSAppTransportSecurityの中にNSExceptionDomainsを指定します。NSExceptionDomainsは辞書型になっておりキーに対象のドメインを指定します。さらにその配下も辞書型になっておりNSExceptionAllowsInsecureHTTPLoadsYESを指定することでATSが無効になります。

【Swift】WKWebViewでHTTP通信を可能にする方法!ATS(App Transport Security)

<dict>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>appdev-room.com</key>
			<dict>
				<key>NSExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
		</dict>
	</dict>
</dict>

NSAppTransportSecurityの設定値

NSAppTransportSecurityの配下には他にもいくつか設定できるキーがあります。

NSAllowsArbitraryLoads

・すべてのネットワーク接続に対してATS制限が無効になっているかどうかを示すブール値
・申請時に正当な理由が必要

NSAllowsArbitraryLoadsForMedia

・AV Foundation フレームワークを使用して行われたリクエストに対してATS制限が無効になっているかどうかを示すブール値
・申請時に正当な理由が必要

NSAllowsArbitraryLoadsInWebContent

・WebViewから行われたリクエストに対してATS制限が無効になっているかどうかを示すブール値
・申請時に正当な理由が必要

NSAllowsLocalNetworking

・ローカル リソースの読み込みを許可するかどうかを示すブール値

NSExceptionDomains

・名前付きドメインのカスタムATS構成

NSExceptionDomainsの設定値

NSExceptionDomainsの配下には他にもいくつか設定できるキーがあります。

NSIncludesSubdomains

・指定されたドメインのサブドメインに構成を拡張するかどうかを示すブール値

NSExceptionAllowsInsecureHTTPLoads

・安全でない HTTP ロードを許可するかどうかを示すブール値
・申請時に正当な理由が必要

NSExceptionMinimumTLSVersion

・ネットワーク接続の最小トランスポート層セキュリティ (TLS) バージョン
・申請時に正当な理由が必要

NSExceptionRequiresForwardSecrecy

・完全な前方秘匿性の要件を上書きするかどうかを示すブール値

NSRequiresCertificateTransparency

・証明書の透明性が必要かどうかを示す古いブール値

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index