1. ホーム
  2. ios

[解決済み] WKWebViewで使用するCookieを設定することはできますか?

2022-04-26 19:28:05

質問

既存のアプリケーションを UIWebView から WKWebView . 現在のアプリは、ユーザーのログインやセッションを webview を設定し cookies 認証に必要な NSHTTPCookieStore . 残念ながら新しい WKWebViewcookies から NSHTTPCookieStorage . 他に実現する方法はありますか?

どのように解決するのですか?

iOS 11+のみ編集可能

使用方法 WKHTTPCookieStore :

let cookie = HTTPCookie(properties: [
    .domain: "example.com",
    .path: "/",
    .name: "MyCookieName",
    .value: "MyCookieValue",
    .secure: "TRUE",
    .expires: NSDate(timeIntervalSinceNow: 31556926)
])! 

webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)

HTTPCookeStorageから引き寄せているので、このようにすることができます。

let cookies = HTTPCookieStorage.shared.cookies ?? []
for cookie in cookies {
    webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
}

iOS 10以下の古い回答

最初のロードリクエストでクッキーを設定する必要がある場合、NSMutableURLRequestで設定することができます。 クッキーは特別にフォーマットされたリクエストヘッダに過ぎないので、このように実現することができます。

WKWebView * webView = /*set up your webView*/
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/index.html"]];
[request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"];
// use stringWithFormat: in the above line to inject your values programmatically
[webView loadRequest:request];

ページ上の後続のAJAXリクエストにクッキーを設定する必要がある場合、WKUserScriptを使用して、次のようにドキュメント開始時にjavascriptを介してプログラム的に値を設定することで実現できます。

WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] 
    initWithSource: @"document.cookie = 'TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';"
    injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
// again, use stringWithFormat: in the above line to inject your values programmatically
[userContentController addUserScript:cookieScript];
WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;
webViewConfig.userContentController = userContentController;
WKWebView * webView = [[WKWebView alloc] initWithFrame:CGRectMake(/*set your values*/) configuration:webViewConfig];

この2つのテクニックを組み合わせることで、Native App LandからWeb View LandにCookieの値を転送するための十分なツールを手に入れることができます。 より詳細な情報は Mozilla のページで、cookie javascript API を公開しています。 より高度なCookieが必要な場合。

ああ、Appleが多くの UIWebView の巧妙な機能 . 今後、サポートされるかどうかは分かりませんが、早く対応してくれることを期待しています。 これが役に立つことを願っています。