Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单击后退按钮是否调用IOS中的applicationWillTerminate方法?_Ios_Swift_Wkwebview_Reload_Lifecycle - Fatal编程技术网

单击后退按钮是否调用IOS中的applicationWillTerminate方法?

单击后退按钮是否调用IOS中的applicationWillTerminate方法?,ios,swift,wkwebview,reload,lifecycle,Ios,Swift,Wkwebview,Reload,Lifecycle,我只是想知道在IOS中单击后退按钮时是否调用了应用程序willterminate()方法。现在,我的ios应用程序中有了这个WKWebView,它加载了一个智能聊天url。如果用户对如何使用该应用程序有任何疑问,可以使用此聊天机器人。我试图实现的是,当用户单击“上一步”按钮并离开包含WKWebView的UI控制器时,不会保存用户与聊天机器人的上一次对话。但是,如果在WKWebView中单击home按钮,用户返回应用程序,则对话仍保留在那里。如果单击“上一步”按钮,如何防止重新加载具有WKWebV

我只是想知道在IOS中单击后退按钮时是否调用了应用程序willterminate()方法。现在,我的ios应用程序中有了这个
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{ 如果让我做饭