How to delete all cookies of UIWebView?

47,936

Solution 1

According to this question, you can go through each cookie in the "Cookie Jar" and delete them, like so:

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
   [storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];

Solution 2

Just wanted to add some info regarding this.

In OS X 10.9/iOS 7 and later, you can use -resetWithCompletionHandler: to clear the cookies and cache etc. of the whole app from your sharedSession:

Empties all cookies, caches and credential stores, removes disk files, flushes in-progress downloads to disk, and ensures that future requests occur on a new socket.

[[NSURLSession sharedSession] resetWithCompletionHandler:^{
    // Do something once it's done.
}];

The for-In loop with deleteCookie: sounds like modifying while enumerating a collection to me. (Don't know, could be a bad idea?)

Solution 3

Previous answers didn't help me in the case of using MKWebView. So, I found another solution:

func loadAuthUrl(_ url: URL) {
        
        let finally: VoidClosure = { [weak self] in
            guard let self = self else { return }
            let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60.0)
            self.webView.load(request)
        }
        
        let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
        cookieStore.getAllCookies({ [weak self] cookies in
            guard let _ = self else { return }
            let instagramCookies = cookies.filter({ $0.domain == ".instagram.com" })
            if instagramCookies.isEmpty {
                finally()
            } else {
                DispatchQueue.global().async(execute: {
                    let group = DispatchGroup()
                    for cookie in cookies {
                        group.enter()
                        cookieStore.delete(cookie, completionHandler: { group.leave() })
                    }
                    group.wait()
                    DispatchQueue.main.async(execute: finally)
                })
            }
        })
    }

Solution 4

If anyone is looking for Swift Solution:

    let storage = HTTPCookieStorage.shared
    if let cookies = storage.cookies{
        for cookie in cookies {
             storage.deleteCookie(cookie)
        }
    }

Solution 5

You could make a function inside the html of the WebView, that cleans the cookies.

If you need the cleaning to be done only once you could trigger this function with a Titanium event, only when the app starts.

Share:
47,936
Vaibhav Saran
Author by

Vaibhav Saran

A highly competent, value driven and seasoned Software Professional with over 13+ years of insightful experience credited with Mobile app development and web app development. Extended expertise in Product Implementation, business analysis, Business Requirement Documentation, fitment and Gap analysis Documentation, SRS writing and Functional Testing; demonstrated ability to manage multiple priorities and developing solution in a rapidly changing environmental; ethical and maintain a high level of confidentiality.

Updated on February 02, 2022

Comments

  • Vaibhav Saran
    Vaibhav Saran over 2 years

    In my application, I have a UIWebview that loads linkedin auth page for login. When user logs in, cookies saves into the application.

    My app has a logout button that is not related to linkedin login. So when user clicks on this button, he logs off from the app. I want that this log off will clear his linkedin cookies also from the app, so that user will log out completely.

  • Ishu
    Ishu almost 13 years
    @Felipe Found a temporary way,need to delete cookies in app load if you logout last time.
  • Felipe Brahm
    Felipe Brahm almost 13 years
    @Ishu well, yes, that's exactly what I'm doing now, but it doesn't really answer the question on how to REALLY delete cookies forever and not just for the current session
  • dsingleton
    dsingleton almost 12 years
    It deletes cookies permanently. Any requests that are made after could result in the cookies being recreated. Also, if you're wanting to delete cookies only for situations where a user is logging out, then I would recommend only deleting session cookies, since logging out is really just a termination of the session. Otherwise you lose potential settings that a user wishes to persist across sessions.
  • Yetanotherjosh
    Yetanotherjosh almost 12 years
    Be sure to call [[NSUserDefaults standardUserDefaults] synchronize] to make sure the changes are saved to disk. @felipe this is why you are seeing the cookies return on subsequent runs.
  • Nada Gamal
    Nada Gamal over 9 years
    I tried this but storage return 0 count , I test it on iOS 8 Simulator .So how can i do to delete cookies of facebook on safari .
  • mylogon
    mylogon about 7 years
    I have used both methods which successfully run, but I am still finding that google is still showing a search history after all of this (not signed in). Any ideas? Thanks
  • Sajjon
    Sajjon almost 7 years
    Will this affect any state of Alamofire and my consumption of my Backend REST APIs? Does not Alamofire base its solution on URLSession?