Ja, das kannst du machen. Fügen Sie zunächst in applicationDidBecomeActive diese Zeile hinzu
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
Die CookieAcceptPolicy wird für mehrere Apps freigegeben und kann ohne Ihr Wissen geändert werden. Sie möchten also sicherstellen, dass Sie bei jeder Ausführung Ihrer App über die erforderlichen Akzeptanzrichtlinien verfügen.
So setzen Sie den Cookie:
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"someValue123456" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
Dieses Cookie hat den Namen testCookie und den Wert someValue123456 und wird mit jeder http-Anfrage an www.example.com gesendet.
Eine große Einschränkung beim Setzen von Cookies finden Sie in meiner Frage hier!
Der NSHTTPCookieStorage-Status wird beim Beenden der App nicht gespeichert. Irgendwelche definitiven Kenntnisse / Dokumentationen da draußen?
Bearbeiten: Anpassung an bearbeitete Frage
NSHTTPCookieStorage
hat eine-setCookies:forURL:mainDocumentURL:
Methode, daher ist es einfach , Cookies zu verwendenNSURLConnection
und zu implementieren-connection:didReceiveResponse:
, sie zu extrahieren und in die Keksdose zu füllen:- ( void )connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSArray *cookies; cookies = [ NSHTTPCookie cookiesWithResponseHeaderFields: [ httpResponse allHeaderFields ]]; [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] setCookies: cookies forURL: self.url mainDocumentURL: nil ]; }
(Sie können auch einfach ein
NSDictionary
Objekt aus demNSHTTPCookie
with extrahierenproperties
und dann das Wörterbuch auf die Festplatte schreiben. Das Einlesen ist so einfach wie das Verwenden vonNSDictionary
's-dictionaryWithContentsOfFile:
und das anschließende Erstellen des Cookies mit-initWithProperties:
.)Dann können Sie den Cookie bei Bedarf wieder aus dem Speicher ziehen:
- ( void )reloadWebview: (id)sender { NSArray *cookies; NSDictionary *cookieHeaders; NSMutableURLRequest *request; cookies = [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] cookiesForURL: self.url ]; if ( !cookies ) { /* kick off new NSURLConnection to retrieve new auth cookie */ return; } cookieHeaders = [ NSHTTPCookie requestHeaderFieldsWithCookies: cookies ]; request = [[ NSMutableURLRequest alloc ] initWithURL: self.url ]; [ request setValue: [ cookieHeaders objectForKey: @"Cookie" ] forHTTPHeaderField: @"Cookie" ]; [ self.webView loadRequest: request ]; [ request release ]; }
quelle
In Swift 3 werden alle Schlüssel in die
HTTPCookiePropertyKey
Struktur eingeschlossen:let cookieProperties: [HTTPCookiePropertyKey : Any] = [.name : "name", .value : "value", .domain : "www.example.com", .originURL : "www.example.com", .path : "/", .version : "0", .expires : Date().addingTimeInterval(2629743) ] if let cookie = HTTPCookie(properties: cookieProperties) { HTTPCookieStorage.shared.setCookie(cookie) }
quelle
domain
undoriginURL
Die durch iOS 10 eingeführten Einschränkungen für Cookies müssen umgangen werden, wodurch sie für verschiedene Prozesse unsichtbar werden.
Dies bedeutet, dass auf Geräten mit Multiprozessor-Funktion Webviews ein anderer Prozess sind als Ihre App. Dies bedeutet, dass Ihre "App" -Sitzung nicht mehr automatisch an die Webview übertragen wird.
Im Wesentlichen müssen Sie dies tun (selbst bei früheren Postern funktionierte es vor iOS10 automatisch).
quelle