UIWebView에 대해 sharedHTTPCookieStorage를 사용하여 쿠키를 수동으로 설정할 수 있습니까?
제대로 인증하려면 인증 쿠키가 필요한 iOS 애플리케이션 내부에 웹보기가 있습니다. 클라이언트에 대한 인증 정보가 이미 있으므로 쿠키를 설정하기 위해 아웃 바운드 요청을 할 필요없이 iOS 애플리케이션의 웹보기 내부에 쿠키를 설정하는 방법을 찾고 있습니다.
이 게시물 은 UIWebView 쿠키가 저장되는 위치를 보여줍니다.
지금은 아웃 바운드 요청을 만들기 위해 숨겨진 웹보기를로드하고 있지만 간단한 쿠키 설정을 위해 외부 요청을 할 필요가 없습니다.
예, 할 수 있습니다. 먼저 applicationDidBecomeActive에서 다음 줄을 추가하십시오.
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
cookieAcceptPolicy는 앱간에 공유되며 사용자 모르게 변경할 수 있으므로 앱이 실행될 때마다 필요한 수락 정책이 있는지 확인하려고합니다.
그런 다음 쿠키를 설정하려면 :
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];
// set expiration to one month from now or any NSDate of your choosing
// this makes the cookie sessionless and it will persist across web sessions and app launches
/// if you want the cookie to be destroyed when your app exits, don't set this
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
이 쿠키의 이름은 testCookie이고 값은 someValue123456이며 http 요청과 함께 www.example.com으로 전송됩니다.
쿠키 설정에 대한 한 가지 큰주의 사항은 여기 내 질문을 참조하십시오!
앱 종료시 NSHTTPCookieStorage 상태가 저장되지 않습니다. 확실한 지식 / 문서가 있습니까?
편집 : 편집 된 질문에 맞게 조정
NSHTTPCookieStorage
이 -setCookies:forURL:mainDocumentURL:
할 수있는 쉬운 일이 사용하므로, 방법 NSURLConnection
및 구현 -connection:didReceiveResponse:
쿠키를 추출하여 쿠키 항아리로 때우는 :
- ( 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 ];
}
(단순히 with NSDictionary
에서 객체를 추출한 다음 사전을 디스크에 쓸 수도 있습니다. 다시 읽는 것은 's 를 사용한 다음를 사용하여 쿠키를 만드는 것만 큼 쉽습니다 .)NSHTTPCookie
properties
NSDictionary
-dictionaryWithContentsOfFile:
-initWithProperties:
그런 다음 필요할 때 쿠키를 저장소에서 다시 꺼낼 수 있습니다.
- ( 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 ];
}
Swift 3에서는 모든 키가 HTTPCookiePropertyKey
구조체에 래핑됩니다 .
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)
}
iOS 10에서 도입 된 쿠키에 대한 제한 사항을 해결해야하며, 이로 인해 쿠키가 다른 프로세스에 표시되지 않습니다.
즉, 다중 처리 기능이있는 기기에서 웹보기는 앱과 별개의 프로세스입니다. 즉, "앱"세션이 더 이상 웹보기에 자동으로 전송되지 않습니다.
그래서 본질적으로 당신은 그것을해야 할 것입니다 (이전의 포스터도 그렇고 iOS10 이전에는 자동으로 작동했습니다).
'code' 카테고리의 다른 글
iPhone "슬라이드하여 잠금 해제"애니메이션 (0) | 2020.10.26 |
---|---|
Xcode 4에서 .h와 .m 사이를 전환하는 방법 (0) | 2020.10.26 |
SQL Server 2005, 날짜 조작에서 시간 차이를 찾기 위해 두 날짜를 비교하는 방법 (0) | 2020.10.26 |
하위 구성 요소의 메서드 호출 (0) | 2020.10.26 |
shift + tab의 키 코드는 무엇입니까? (0) | 2020.10.26 |