单击后退按钮是否调用IOS中的applicationWillTerminate方法?
我只是想知道在IOS中单击后退按钮时是否调用了应用程序willterminate()方法。现在,我的ios应用程序中有了这个单击后退按钮是否调用IOS中的applicationWillTerminate方法?,ios,swift,wkwebview,reload,lifecycle,Ios,Swift,Wkwebview,Reload,Lifecycle,我只是想知道在IOS中单击后退按钮时是否调用了应用程序willterminate()方法。现在,我的ios应用程序中有了这个WKWebView,它加载了一个智能聊天url。如果用户对如何使用该应用程序有任何疑问,可以使用此聊天机器人。我试图实现的是,当用户单击“上一步”按钮并离开包含WKWebView的UI控制器时,不会保存用户与聊天机器人的上一次对话。但是,如果在WKWebView中单击home按钮,用户返回应用程序,则对话仍保留在那里。如果单击“上一步”按钮,如何防止重新加载具有WKWebV
WKWebView
,它加载了一个智能聊天url。如果用户对如何使用该应用程序有任何疑问,可以使用此聊天机器人。我试图实现的是,当用户单击“上一步”按钮并离开包含WKWebView
的UI控制器时,不会保存用户与聊天机器人的上一次对话。但是,如果在WKWebView
中单击home按钮,用户返回应用程序,则对话仍保留在那里。如果单击“上一步”按钮,如何防止重新加载具有WKWebView
的UI控制器 在应用程序willresignative
中执行此操作
如果您只单击主页按钮,则不会终止应用程序。它仍然存在于后台,因此不会调用
applicationWillTerminate
。确定首先为什么applicationWillTerminate会在返回按钮时被调用这只是为了弹出viewcontroller,直到您显式退出应用程序。其次,您应该检查如何清除聊天机器人当前会话,以便无论何时单击“上一步”或“查看”按钮,都可以清除聊天机器人会话,从而不会保存会话。我认为无论您使用什么聊天机器人,它们都在缓存对话,直到您从会话注销或执行一些清理
--更新----
在自定义类部分uistoryboard中将以下用作WKWebview父类
import Foundation
import WebKit
class WKCookieWebView : WKWebView {
private let useRedirectCookieHandling: Bool
init(frame: CGRect, configuration: WKWebViewConfiguration, useRedirectCookieHandling: Bool = false) {
self.useRedirectCookieHandling = useRedirectCookieHandling
configuration.applicationNameForUserAgent = "Version/8.0.2 Safari/600.2.5"
super.init(frame: frame, configuration: configuration)
}
required init?(coder: NSCoder) {
self.useRedirectCookieHandling = false
super.init(coder: coder)
}
override func load(_ request: URLRequest) -> WKNavigation? {
guard useRedirectCookieHandling else {
return super.load(request)
}
requestWithCookieHandling(request, success: { (newRequest , response, data) in
DispatchQueue.main.async {
self.syncCookiesInJS()
if let data = data, let response = response {
let _ = self.webViewLoad(data: data, response: response)
} else {
self.syncCookies(newRequest, nil, { (cookieRequest) in
let _ = super.load(cookieRequest)
})
}
}
}, failure: {
// let WKWebView handle the network error
DispatchQueue.main.async {
self.syncCookies(request, nil, { (newRequest) in
let _ = super.load(newRequest)
})
}
})
return nil
}
private func requestWithCookieHandling(_ request: URLRequest, success: @escaping (URLRequest, HTTPURLResponse?, Data?) -> Void, failure: @escaping () -> Void) {
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
let task = session.dataTask(with: request) { (data, response, error) in
if let _ = error {
failure()
} else {
if let response = response as? HTTPURLResponse {
let code = response.statusCode
if code == 200 {
// for code 200 return data to load data directly
success(request, response, data)
} else if code >= 300 && code < 400 {
// for redirect get location in header,and make a new URLRequest
guard let location = response.allHeaderFields["Location"] as? String, let redirectURL = URL(string: location) else {
failure()
return
}
let request = URLRequest(url: redirectURL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5)
success(request, nil, nil)
} else {
success(request, response, data)
}
}
}
}
task.resume()
}
private func webViewLoad(data: Data, response: URLResponse) -> WKNavigation! {
guard let url = response.url else {
return nil
}
let encode = response.textEncodingName ?? "utf8"
let mine = response.mimeType ?? "text/html"
return self.load(data, mimeType: mine, characterEncodingName: encode, baseURL: url)
}
}
extension WKCookieWebView {
// sync HTTPCookieStorage cookies to URLRequest
private func syncCookies(_ request: URLRequest, _ task: URLSessionTask? = nil, _ completion: @escaping (URLRequest) -> Void) {
var request = request
var cookiesArray = [HTTPCookie]()
if let task = task {
HTTPCookieStorage.shared.getCookiesFor(task, completionHandler: { (cookies) in
if let cookies = cookies {
cookiesArray.append(contentsOf: cookies)
let cookieDict = HTTPCookie.requestHeaderFields(with: cookiesArray)
if let cookieStr = cookieDict["Cookie"] {
request.addValue(cookieStr, forHTTPHeaderField: "Cookie")
}
}
completion(request)
})
} else if let url = request.url {
if let cookies = HTTPCookieStorage.shared.cookies(for: url) {
cookiesArray.append(contentsOf: cookies)
}
let cookieDict = HTTPCookie.requestHeaderFields(with: cookiesArray)
if let cookieStr = cookieDict["Cookie"] {
request.addValue(cookieStr, forHTTPHeaderField: "Cookie")
}
completion(request)
} else {
if let cookies = HTTPCookieStorage.shared.cookies {
cookiesArray.append(contentsOf: cookies)
}
let cookieDict = HTTPCookie.requestHeaderFields(with: cookiesArray)
if let cookieStr = cookieDict["Cookie"] {
request.addValue(cookieStr, forHTTPHeaderField: "Cookie")
}
completion(request)
}
}
// MARK: - JS Cookie handling
private func syncCookiesInJS(for request: URLRequest? = nil) {
if let url = request?.url,
let cookies = HTTPCookieStorage.shared.cookies(for: url) {
let script = jsCookiesString(for: cookies)
let cookieScript = WKUserScript(source: script, injectionTime: .atDocumentStart, forMainFrameOnly: false)
self.configuration.userContentController.addUserScript(cookieScript)
} else if let cookies = HTTPCookieStorage.shared.cookies {
let script = jsCookiesString(for: cookies)
let cookieScript = WKUserScript(source: script, injectionTime: .atDocumentStart, forMainFrameOnly: false)
self.configuration.userContentController.addUserScript(cookieScript)
}
}
private func jsCookiesString(for cookies: [HTTPCookie]) -> String {
var result = ""
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss zzz"
for cookie in cookies {
result += "document.cookie='\(cookie.name)=\(cookie.value); domain=\(cookie.domain); path=\(cookie.path); "
if let date = cookie.expiresDate {
result += "expires=\(dateFormatter.string(from: date)); "
}
if (cookie.isSecure) {
result += "secure; "
}
result += "'; "
}
return result
}
}
extension WKCookieWebView : URLSessionTaskDelegate {
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
syncCookies(request) { (newRequest) in
completionHandler(newRequest)
}
}
}
<代码>导入基础
导入WebKit
类WKCookieWebView:WKWebView{
私有let useRedirectCookieHandling:Bool
init(frame:CGRect,配置:WKWebViewConfiguration,useredirectcookieholling:Bool=false){
self.useRedirectCookieHandling=useRedirectCookieHandling
configuration.applicationNameForUserAgent=“Version/8.0.2 Safari/600.2.5”
init(帧:帧,配置:配置)
}
必需初始化?(编码器:NSCoder){
self.useRedirectCookieHandling=false
super.init(编码器:编码器)
}
覆盖函数加载(u请求:URLRequest)->WKNavigation{
guard UsereDirectCookie处理其他{
返回超级加载(请求)
}
requestWithCookieHandling(请求,成功:{(新请求,响应,数据)在
DispatchQueue.main.async{
self.syncCookiesInJS()
如果let data=data,则let response=response{
let=self.webview加载(数据:数据,响应:响应)
}否则{
中的self.syncCookies(newRequest,nil,{(cookierrequest))
让uz=super.load(cookieRequest)
})
}
}
},失败:{
//让WKWebView处理网络错误
DispatchQueue.main.async{
self.syncCookies(request,nil,{(newRequest))在
让ux=super.load(newRequest)
})
}
})
归零
}
私有func requestWithCookieHandling(request:URLRequest,成功:@escaping(URLRequest,HTTPURLResponse?,数据?)->Void,失败:@escaping()->Void){
让sessionConfig=URLSessionConfiguration.default
let session=URLSession(配置:sessionConfig,委托:self,委托队列:nil)
让task=session.dataTask(with:request){(data,response,error)在
如果let=错误{
失败()
}否则{
如果let response=response as?HTTPURLResponse{
让代码=response.statusCode
如果代码==200{
//对于代码200,返回数据以直接加载数据
成功(请求、响应、数据)
}否则,如果代码>=300&&code<400{
//对于重定向,获取标头中的位置,并发出新的URL请求
guard let location=response.allHeaderFields[“location”]作为?字符串,let redirectURL=URL(字符串:位置)else{
失败()
返回
}
let request=URLRequest(url:redirectURL,cachePolicy:。重新加载IgnoringLocalAndRemoteCacheData,timeoutInterval:5)
成功(请求,无,无)
}否则{
成功(请求、响应、数据)
}
}
}
}
task.resume()
}
private func webViewLoad(数据:数据,响应:URLResponse)->WKNavigation{
guard let url=response.url else{
归零
}
让encode=response.textEncodingName??“utf8”
让我的=response.mimeType??“text/html”
返回self.load(数据,mimeType:mine,characterEncodingName:encode,baseURL:url)
}
}
WebView的扩展{
//将HTTPCookieStorage cookies同步到URL请求
private func syncCookies(u请求:URLRequest,u任务:URLSessionTask?=nil,u完成:@escaping(URLRequest)->Void){
var请求=请求
var cookiesArray=[HTTPCookie]()
如果让任务=任务{
HTTPCookieStorage.shared.getCookiesFor(任务,completionHandler:{(cookies))在
如果让cookies=cookies{
附加(内容:cookies)
让cookieDict=HTTPCookie.requestHeaderFields(带:CookieArray)
如果让cookieStr=cookieDict[“Cookie”]{
request.addValue(cookieStr,forHTTPHeaderField:“Cookie”)
}
}
完成(请求)
})
}如果let url=request.url,则为else{
如果让我做饭