2016-08-02 13 views
7

Chcę zalogować się na wiele kont tej samej witryny w innym webView. Na przykład mam Tab Bar Controller, który zawiera trzy kontrolery widoku i każdy widok kontrolerów widoku zawierający webView. I na przykład umieszczam adres URL stackoverflow dla każdej klasy na webView. W jaki sposób użytkownik może zalogować się na różne konta w tym samym czasie, korzystając z tych trzech webView? Próbowałem tego, ale mogę po prostu zalogować się do jednego użytkownika na raz. Znalazłem, że muszę utworzyć oddzielne cookie dla każdego UIWebView, ale w większości odpowiedzi są w celu-c, a nie właściwej odpowiedzi, którą chcę. Na przykład (FirstSecondThird) Czy ktoś może mi powiedzieć, jak mogę to zrobić?Oddzielne przechowywanie plików cookie dla dwóch osób (UIWebView lub WKWebView)

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() 
    } 


} 

Dzięki

The preview of my executing code.

+0

Przeczytałem wiele postów na temat oddzielnego słoika na pliki cookie lub magazynu na (uiwebview, wkwebview), ale nie otrzymałem żadnej pomocy. Sprawdzam, że jest to bardzo trudne w OS X (http://stackoverflow.com/questions/364219/how-can-i-have-multiple-instances-of-webkit-without-sharing-cookies) (http: // stackoverflow.com/questions/28456789/separate-cookie-jar-per-webview-in-os-x) (https://github.com/jjconti/swift-webview-isolated) (https://github.com/ cyyuen/ADCookieIsolatedWebView) Ktoś ma jakiś pomysł, jak mogę to osiągnąć? – ZAFAR007

+0

czy próbowałeś [this] (http://igisolatedcookiewebview.googlecode.com/)? – ddb

+0

@ddb tak, byłem sprawdzić, ale to jest dla OS X. Cocoa jest ramy rozwoju Mac. Nie istnieje na iOS. – ZAFAR007

Odpowiedz

4

Można to zrobić z WKWebView przy użyciu różnych wystąpień 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) 

Niestety, tracisz webView danych (takich jak pliki cookie, cache , itp.) po restarcie aplikacji, ponieważ nietrwały WKWebsiteDataStore nie można zapisać t o disk (można zauważyć, że WKWebsiteDataStore implementuje NSCoding, ale nie działa w przypadku nietrwałych sklepów).

+0

Ermolov, Dzięki. Widziałem [WKWebSiteDataStore] (https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKWebsiteDataStore_Class_Ref/), ale jest to dostępne tylko w iOS 9. Czy masz pojęcie, jak mogę to zrobić w iOS 8. Również sprawdzam twój kod, który daje mi ten błąd ** Typ 'WKWebsiteDataStore' nie ma członka 'nonPeristent' **? – ZAFAR007

+0

Istnieją prywatne klasy '_WKWebsiteDataStore' z metodą' nonPersistentDataStore' i własność prywatna '_WKWebsiteDataStore * _websiteDataStore' w' WKWebViewConfiguration', które są dostępne w iOS 8. Można utworzyć wystąpienie tej klasy przy użyciu funkcji uruchomieniowych (dowiedz się więcej o środowisku wykonawczym w Objective-C). Ponadto musisz wiedzieć, że Apple zabrania używania prywatnych klas/metod w kodzie produkcyjnym, ale możesz go wypróbować w swoim projekcie testowym. Powyższy błąd dotyczy wersji Swift, której używasz. Używam Swift 3 (Xcode 8 beta), może być konieczna zmiana nazwy metody na 'nonPersistentDataStore'. –

+0

Dzięki teraz działa. masz na myśli, że mogę używać tylko prywatnych klas/metod do projektu testowego, a nie do wdrożenia w sklepie z aplikacjami. Mam dla ciebie jeszcze jedno pytanie, czy możesz powiedzieć, czy istnieje sposób na zapisanie cookie w pamięci przy użyciu tej metody, aby następnym razem otworzyć wkwebview od miejsca, w którym zostawiam go po uruchomieniu aplikacji? – ZAFAR007

Powiązane problemy