【iOS】ATS
UIWebView, WKWebView, Safari, SFSafariViewController
UIWebView
since iOS 2, deprecated now.
WKWebView
Since iOS 8, for replacing the UIWebView, faster, lower memory costs, less bugs to make crash, and much more safty.
import WebKit
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
let myURL = URL(string: "https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
view.addSubview(webView)
Safari
An outside browser to make it easy to view a web page without interaction with app.
@IBAction func showWebSite() {
let url = NSURL(string: "https://www.google.com")
UIApplication.sharedApplication().openURL(url!)
}
SFSafariViewController
Since iOS 9, an embedded Safari browser can be used to view a web page in Safari like UI, wihtout leaving our app, with sharing all user data from Safari, but with less content controlling from our app.
SFSafariViewControllerはアプリ内でWeb画面を表示したいときに使うことをAppleが奨励しています。これにより、今まで自作アプリからSafariを起動させていたのに対して、アプリ内でSafariを呼び出すことが可能となりました。
気をつけて欲しいのは、 カスタマイズはできない ということです。
例えば、UIWebViewやWKWebViewでやっていたような『Web側から document.location = …. を実行することでネイティブ側で何か処理をさせる』といったことはできません。
あくまでも 単なるWebサイトの表示 に利用します。
needs: SafariServices.framework
@IBAction func showWebSite() {
let url = NSURL(string: "https://www.google.com")
let safariVC = SFSafariViewController(URL: url!)
self.showViewController(safariVC, sender: nil)
}
ATS
App Transport Security, since iOS 9.
ATS設定の適用範囲
- NSURLRequest
- NSURLConnection
- NSURLSession
- UIWebView
- WKWebView
- CFNetwork
ATSの対象外
- Appleが提供している低レベルネットワークAPI(具体的な記述はない)
- サードパーティのネットワークライブラリを利用
- SFSafariViewController / Safari
ATS protections are not available when using lower-level networking APIs provided by Apple, or when using third-party networking libraries.
Note: Consider risks carefully before opting to use lower-level networking APIs provided by Apple, or opting to use third-party networking libraries. Such approaches lose App Transport Security protections, putting your app and your user’s data at risk.
If you’re using SFSafariViewController, you shouldn’t need any ATS exceptions; SFSafariViewController acts just like Safari with regards ATS.
Disable ATS
- If you’re using UIWebView, you will need to use NSAllowsArbitraryLoads. In this case you should include an explanation as to why it’s necessary for you to continue using UIWebView rather than WKWebView.
- If you’re using WKWebView, take advantage of NSAllowsArbitraryLoadsInWebContent.
- If you’re using SFSafariViewController, you shouldn’t need any ATS exceptions; SFSafariViewController acts just like Safari with regards ATS.
iOS 9
info.plist: NSAppTransportSecurity > NSAllowsArbitraryLoads:true
ATSを無効にする(Appleは非推奨)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
ドメインを指定してATSを無効にする(推奨ではないが、暫定対応としてはこちらを推奨していると思われる)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>xxx.co.jp</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
iOS 10
info.plist: NSAppTransportSecurity > NSAllowsArbitraryLoadsInWebContent:true
<key>NSAppTransportSecurity</key>
<dict>
<key> NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
References
- 关于 iOS 10 中 ATS 的问题
- UIWebViewを使わない理由とWKWebViewを使う理由
- WebKit, Safari and SafariViewController
- SFSafariViewControllerを使ってみよう!
- iOS9 ATS問題
- iOS10 ATS(App Transfer Security)のApple公式ドキュメントのまとめと翻訳メモ
- 【Apple WWDC 2016】iOS 10のApp Transport Securityと2016年末からのATS必須化についてAppleのエンジニアに聞いてきた
- Cocoa Keys - Apple developer