Separate cookie storage for two (UIWebView or WKWebView)
Asked Answered
P

1

11

I want to login many accounts of same site in different webView. For example i have Tab Bar Controller that contains three view controllers and each view controllers contain webView. And for example i embed stackoverflow url for webView in every class. How user can login to different accounts at the same time using these three webView? I've tried this but i can just login one user at a time. I have found that i need to create separate cookie for every UIWebView, but mostly answers are in objective-c and not the proper answer i want. For example (First Second Third) Can any one please tell me how i can do it?

class FirstViewController: UIViewController , UIWebViewDelegate{

    @IBOutlet weak var webView: UIWebView!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

    override func viewDidLoad() {
        webView.delegate = self
        let requestURL = NSURL(string: "http://stackoverflow.com")
        let request = NSURLRequest(URL: requestURL!)
        activityIndicator.hidesWhenStopped = true
        activityIndicator.startAnimating()
        webView.loadRequest(request)

    }
       func webViewDidFinishLoad(webView: UIWebView) {
        activityIndicator.stopAnimating()
    }

}

class SecondViewController: UIViewController, UIWebViewDelegate{

    @IBOutlet weak var webView: UIWebView!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

    override func viewDidLoad() {
        webView.delegate = self
        let requestURL = NSURL(string: "http://stackoverflow.com")
        let request = NSURLRequest(URL: requestURL!)
        activityIndicator.hidesWhenStopped = true
        activityIndicator.startAnimating()
        webView.loadRequest(request)

    }
        func webViewDidFinishLoad(webView: UIWebView) {
        activityIndicator.stopAnimating()
    }


}

Thanks

The preview of my executing code.

Pneumectomy answered 2/8, 2016 at 4:13 Comment(6)
I read many posts about separate cookie jar or storage per (uiwebview, wkwebview) but did't get any help. I check that is also very difficult in OS X (#364719) (#28457289) (github.com/jjconti/swift-webview-isolated) (github.com/cyyuen/ADCookieIsolatedWebView) Any one have any idea how i can achieve this??Pneumectomy
did you try this?Frap
@Frap yes i was check that but this is for OS X. Cocoa is the Mac development framework. It doesn't exist on iOS.Pneumectomy
@Frap right now, your link not on a server show so can you send me detail of OSX for Separate cookie storage for two (UIWebView or WKWebView).Cob
sorry @ronakpatel but that code wasn't mine, in fact I didn't made an answer, only posted a commentFrap
I have the same issue, it's solved?Elenoraelenore
C
12

You can do this with WKWebView by using different instances of WKWebSiteDataStore:

let configuration1 = WKWebViewConfiguration()
configuration1.websiteDataStore = WKWebsiteDataStore.nonPersistent()
self.webView1 = WKWebView(frame: CGRect.zero, configuration: configuration1)
self.view.addSubview(self.webView1)

let configuration2 = WKWebViewConfiguration()
configuration2.websiteDataStore = WKWebsiteDataStore.nonPersistent()
self.webView2 = WKWebView(frame: CGRect.zero, configuration: configuration2)

Unfortunately, you will loose webView data (such as cookies, cache, etc) after app restart, because non-persistent WKWebsiteDataStore can't be saved to disk (you could notice that WKWebsiteDataStore implements NSCoding, but it doesn't work for non-persistent stores).

Chelsiechelsy answered 24/8, 2016 at 14:4 Comment(7)
Ermolov, Thanks. I was seen WKWebSiteDataStore , but this is only avialable in iOS 9. Have you any idea how i can do this in iOS 8. Also i check your code it gives me that error Type 'WKWebsiteDataStore' has no member 'nonPersistent' ??Pneumectomy
There are private class _WKWebsiteDataStore with method nonPersistentDataStore and private property _WKWebsiteDataStore *_websiteDataStore in WKWebViewConfiguration that are available in iOS 8. You can create instance of this class using runtime functions (learn about runtime in Objective-C). Also, you need to know that Apple prohibits to use private classes/methods in production code, but you can try it in your test project. The error above related to version of Swift you are using. I use Swift 3 (Xcode 8 beta), you might need to change the name of method to nonPersistentDataStore.Chelsiechelsy
Thanks now it works. you mean i can only use private class/methods for test project not for deployment on app store. I have one more question to you, can you please tell is there any way to save cookie on storage using this method for next time opening wkwebview from where i leave it after restart app??Pneumectomy
Please read my answer above; as far as I know, it is impossible.Chelsiechelsy
@ Roman Ermolov hi your code in some issue for can u plz solve for me when I back tab2 to tab 1 at that time clear cookies types of function work and show page login page not show already login page.so plz help me I m new ios developer so cant understand in this situation what should I do.Cob
It's worth mentioning that you can't use the aspects of NSCoding to persist data for any type of WKWebsiteDataStore. For example, if you get a copy of WKWebsiteDataStore.default(), persist it, then load it at the next app launch, it will load and function, but it too will not have any data associated with it. As near as I can tell, the NSCoding implementation is not generally functional for consumers, in the way they would expect.There
This worked for me when I had a caching issue between NSURLSession and wkWebview. Thank you!Demonstrator

© 2022 - 2024 — McMap. All rights reserved.