Https:// URLを使用して、iOS9のUIWebViewにページをロードしようとしています。読み込まれたページには、安全でないサーバーからのCSSと画像が含まれます。
例えば。ロードされたページ:https://www.example.com/スタイルシートを含むhttp =://www.example.com/style.cssおよびイメージhttp://www.example.com/image.jpg
元のページが安全でない接続(通常のhttp)を介して読み込まれた場合、すべてが機能します。すべては、HTTPSとHTTPの両方を介してiOS8でも動作します。
アプリケーションPLISTファイルでNSAppTransportSecurityをNSAllowsArbitraryLoadsに設定しました:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
ただし、HTTPS経由でページを読み込む場合、画像は読み込まれますが、CSSファイルは読み込まれません。 UIWebViewブロックのように見えますが、安全でないページから安全でないリソースをロードしています。
安全でない接続を介してCSSをロードできるようにするUIWebViewの設定はありますか?
これはATSとは関係ありません。 WebKitは、ホストページがhttps経由で提供されている場合、「アクティブ」コンテンツ(JS、CSSなど)の特定のクラスへのアクセスが安全でない接続を介してロードされることを禁止する混合コンテンツポリシーを適用します。
インスペクターでページを調べると、エラーパネルに報告されていることがわかります。
フォローアップ:混合コンテンツのブロックをオフにすることはできません。安全でないCSSまたはJSを許可すると、ページ全体のセキュリティが最も安全でないリソースのセキュリティに低下します。 httpでcss/jsをロードする必要がある場合の解決策は、httpでページ全体をロードすることです。これにより、ユーザーに表示されるUIはコンテンツのセキュリティを正しく反映します。
Info.plistで、次のApp Transport Securityキーを追加する必要があります。
NSAppTransportSecurity Dictionary
NSAllowsArbitraryLoads Boolean YES
NSExceptionDomains Dictionary
**YOUR-DOMAIN-HERE** Dictionary
NSExceptionAllowsInsecureHTTPLoads Boolean YES
NSIncludesSubdomains Boolean YES
NSThirdPartyExceptionAllowsInsecureHTTPLoads Boolean YES
うまくいけば、これはあなたのために働くはずです。
App Transport SecurityはiOS9リリースで改訂されました。これで、アプリケーションは安全でない接続から安全になりました。また、iOSは安全な接続を強制します。あなたの場合、これは競合する可能性があります。
FromAppleドキュメント
アプリが安全でないドメインにリクエストを行う必要がある場合、アプリのInfo.plistファイルでこのドメインを指定する必要があります
したがって、これはWebページの.css
ファイルのロード中に問題を引き起こす可能性があると思います。
info.plist
でドメインを指定して、.css
ファイルがロードされているかどうかを確認してください。
編集:
Spotlight:info.plist
にさらにキーを追加する必要があります。
このキーNSThirdPartyExceptionAllowsInsecureHTTPLoads
を見ると、開発者によって制御されていないサービスドメインが許可され、安全でないリソースを渡すことでトランスポートレイヤーに例外を追加できます。
App Transport Securityのキーを追加するための構造は次のとおりです。
すべてのキーの詳細と説明については、このメモを確認してください- App Transport Security Technote
以下の手順により、安全でないコンテンツをWKWebViewで開くことができます。
以下にwkwebviewデリゲートメソッドを追加しました。
func webView(_ webView:WKWebView、didReceive challenge:URLAuthenticationChallenge、completionHandler:@escaping(URLSession.AuthChallengeDisposition、URLCredential?)-> Void){completionHandler(.useCredential、URLCredential(trust:challenge.protectionSpace.serverTrust!))}
2番目のステップでは、デリゲートを次のように登録することを忘れないでください。
オーバーライドfunc viewDidLoad(){super.viewDidLoad()self.webView.navigationDelegate = self}