2016-09-29 5 views
15

내 iPhone 응용 프로그램, 로그인/등록을 허용하고 쿠키에 세션 정보를 저장하는 웹 사이트에서 WKWebView를 사용하고 있습니다. 쿠키 정보를 지속적으로 저장하는 방법을 알아 내려고 노력 중이므로 앱이 다시 시작될 때 사용자가 여전히 웹 세션을 사용할 수 있습니다.WKWebView 쿠키 영구 저장

저는 앱에 2 개의 WKWebViews가 있으며, 그들은 WKProcessPool을 공유합니다. 나는 공유 프로세스 풀과 시작 : 내가 처음 WKWebView을 사용하여 로그인 한 후 약간의 시간이 나중에 2 WKWebView에 작업을 통과

WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; 
theConfiguration.processPool = processPool; 
self.webView = [[WKWebView alloc] initWithFrame:frame configuration:theConfiguration]; 

: 각 WKWebView에 대한 다음 WKProcessPool *processPool = [[WKProcessPool alloc] init];

세션이 유지되므로 쿠키가 성공적으로 공유됩니다. 그러나 앱을 다시 실행하면 새 프로세스 풀이 생성되고 세션 정보가 삭제됩니다. 앱을 다시 시작하여 세션 정보를 유지할 수있는 방법이 있습니까?

+0

'WKWebView' 데이터를 저장하기 위해 추가 작업을 수행 할 필요가 없습니다 - 자동으로 저장해야합니다 (명확히해야 할 것은'defaultDataStore' 구성에 포함되어 있기 때문에 디스크에 저장됩니다. 'WKWebView'에서 세션 정보가 손실되었는지 확인 하시겠습니까? 쿠키에 작은 ttl이나 다른 것이있을 수 있습니까? 이것을 확인 했습니까? –

답변

9

a)는 여전히 애플 (내 생각)와 b) 당신이 원하는 쿠키에 의존하여 해결 아니에요 일부 bug, 내가 생각하는 거기 때문에 실제로 생각입니다.

나는 지금이 테스트 할 수 없습니다,하지만 난 당신에게 몇 가지 포인터를 제공 할 수 있습니다 :

  1. 얻기 쿠키를 NSHTTPCookieStorage.sharedHTTPCookieStorage()에서. 이것은 하나의 버그가있는 것 같습니다. 분명히 쿠키는 즉시 찾아 내기 위해 저장되지 않습니다. NSHTTPCookieStorage. People은 프로세스 풀을 재설정하여 저장을 시작하도록 제안하지만 안정적으로 작동하는지 여부를 알지 못합니다. 당신은 너 자신을 위해 그것을 밖으로 시도하고 싶을지도 모르다.
  2. 프로세스 풀은 실제로 쿠키를 저장하는 것이 아닙니다 (올바르게 명시한대로 공유되는지 여부를 정의하지만). 설명서에 그게 WKWebsiteDataStore인데, 그렇게 보았습니다. 최소한 fetchDataRecordsOfTypes:completionHandler:을 사용하여 거기에서 쿠키를 얻는 것이 가능할 수도 있습니다 (설정 방법을 모르지만 프로세스 풀과 동일한 이유로 사용자 기본값에 저장소를 저장할 수 없다고 가정).
  3. 필요로하는 쿠키 (또는 그 값)를 얻을 수 있지만 복원 할 수없는 경우에는 here으로 표시하십시오 (기본적으로 httprequest를 미리 준비하는 방법을 보여줍니다. 관련 부분 : [request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"]).
  4. 모두 실패한 경우 this을 확인하십시오. 나는 단지 링크 만 제공하는 것이 좋지는 않지만, 모든 것을 복사 할 수는 없으며, 완전성을 위해서 추가하려고합니다.

일반적으로 마지막으로 한 가지 : 귀하의 성공은 쿠키의 유형에 달려 있다고합니다. this answer은 서버가 설정 한 쿠키가 NSHTTPCookieStorage을 통해 액세스 할 수 없다고 명시하고 있기 때문입니다. 그게 당신과 관련이 있는지 나는 모르겠다. (아마 당신은 아마도 세션을 찾고 있는데, 즉 서버 세트 쿠키, 맞습니까?) 이것이 다른 방법도 실패했는지 여부를 알 수 없습니다.

그 밖의 모든 것이 실패하면 사용자 인증 정보를 어딘가에 저장하고 (예 : 키 체인) 다음 앱 시작시 다시 사용하여 자동으로 인증되도록하는 것이 좋습니다. 이렇게하면 모든 세션 데이터가 복원되지는 않지만 사용자가 앱을 종료했다고 생각하면 아마 실제로 바람직 할 것입니다. 어쩌면 어떤 값은 나중에 언급 된 here처럼 주입 된 스크립트를 사용하여 나중에 사용하기 위해 잡아서 저장할 수 있습니다. (당연히 시작할 때 설정하는 것이 아니지만 어느 시점에서 가져올 수도 있습니다.) 물론 사이트가 어떻게 작동하는지 알아야합니다.).

최소한 문제를 해결하는 새로운 방향으로 안내 할 수 있기를 바랍니다. 세션 쿠키는 보안과 관련이있어서 응용 프로그램에서 멀리 숨기면 Apple이 의식적으로 선택한 디자인입니다 ...).

+0

결국 NSHTTPCookiesStorage에서 일부 쿠키를 볼 수있게 된 것 같습니다. 그래서 당신이 옳았습니다. 즉각적으로 저장되지 않았을 수도 있습니다. 그러나 세션에 필요한 쿠키가없는 것처럼 보였으므로 서버 측 쿠키와 관련된 마지막 사항은 현재 상황입니다. – haplo1384

+0

Dang it, 나쁘다. 아마도 앱이 완전히 다시 시작되면 적극적으로 다시 로그인해야 할 것입니다. 당신이 어딘가에 안전하게 사용자의 신임 정보를 저장하는 한 (나는 적어도 비밀번호에 대해 키 체인을 제안한다) 괜찮을 것이다. 물론 이상적인 것은 아니지만 적절한 HTTPRequest를 사용하여 새 세션 토큰을 요청할 수 있습니까? – Gero

-1

NSUserDefaults에 정보를 저장하십시오. 동시에 세션 정보가 매우 중요하면 KeyChain에 저장하는 것이 좋습니다.

+0

사용자 기본값에 어떤 정보를 저장 하시겠습니까? WKProcessPool을 기본값으로 저장할 수 없으므로 인코딩 할 수 있다는 오류가 있습니다. – haplo1384

0

WKWebViewNSCoding을 따르므로 NSCoder을 사용하여 webView를 디코딩/인코딩하고 다른 곳 (예 : NSUserDefaults)에 저장할 수 있습니다.

//return data to store somewhere 
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:self.webView];/ 

self.webView = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
+0

고맙지 만 새로운 앱을 실행 한 후 nsuserdefaults에서 WKWebView를 검색하면 웹 사이트의 세션 정보가 유지되지 않습니다. – haplo1384

3

나는 파티에 약간 늦었지만 사람들이 유용하다고 생각할 수도 있습니다. 해결 방법이 있습니다. 조금 짜증나지만, 적어도 사과가 바보 API를 고칠 때까지는 안정적으로 작동하는 유일한 해결책이라고 할 수 있습니다. ...

나는 좋은 삼일을 보내고 있습니다. WKWebView에서 캐시 된 쿠키를 꺼내서 아무데도 데려다주지 않아 결국에는 서버에서 직접 쿠키를 얻을 수 있다고 발표했습니다.

내가 시도한 첫 번째 일은 WKWebView 내에서 실행되는 자바 스크립트로 모든 쿠키를 가져온 다음 WKUserContentController에 전달하여 UserDefaults에 저장합니다. 이것은 내 쿠키 이후로 작동하지 않았다 httponly 그리고 분명히 당신은 자바 스크립트와 그 사람을 얻을 수 없다 ...

나는 서버 측 (Ruby on Rail) 페이지에 자바 스크립트 호출을 삽입하여 그것을 수정했다. 내 경우에는) 쿠키를 매개 변수로 사용하여

sendToDevice("key:value")

상기 JS 함수

단순히 장치에 쿠키를 전달한다. 이것은 누군가가 정상적인 상태를 유지하는데 도움이되기를 희망합니다 ...