2016-09-29 27 views
15

私はネイティブiPhoneアプリケーション、ログイン/登録を許可するWebサイトでWKWebViewを使用しており、セッション情報をCookieに保存しています。私は、Cookie情報を永続的に保存する方法を理解しようとしています。そのため、アプリが再起動しても、ユーザーは引き続きWebセッションを利用できます。WKWebView Cookieの永続的ストレージ

私は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];

セッションは保持されるので、Cookieは正常に共有されました。しかし、私がアプリケーションを再起動すると、新しいプロセスプールが作成され、セッション情報が破棄されます。アプリケーションの再起動によってセッション情報を保持する方法はありますか?

+0

'WKWebView'データを保存するために追加のアクションを行う必要はありません - 自動的に保存する必要があります(唯一明確にする必要があるのは' defaultDataStore'ディスクに保存されているのは1つだけなので)。 'WKWebView'でセッション情報が失われたことは確かですか?クッキーに小さなttlなどがある可能性はありますか?これをチェックしましたか? –

答えて

9

)まだアップル(と思う)およびb)あなたが望むクッキーに依存することで解決ていないいくつかのbugは、私が考えてありますので、これは実際にかかわらず、1です。

私は今、これをテストすることができませんでしたが、私はあなたにいくつかのポインタを与えることができます:

  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でアクセスできないと述べているからです。それがあなたと関係があるかどうかはわかりませんが(おそらく、セッションを探している、つまりサーバセットのCookieが正しいので、それは正しいと思いますか?)これは他の方法も失敗することを意味するかどうかはわかりません。

他のすべてが失敗した場合は、ユーザーの資格情報をどこかに保存し(キーチェーンなど)、次回のアプリケーションの起動時に再利用して自動的に認証することを検討することもできます。これはすべてのセッションデータを復元するわけではないかもしれませんが、ユーザーが実際に望ましいかもしれないアプリケーションを終了すると考えていますか? また、後で使用するために、hereなどの注入スクリプトを使用して特定の値をキャッチして保存することもできます(当初は設定するのではなく、ある時点で取得することは当然できます)。 )。

少なくとも、問題を解決する新しい方向に向けることができたら幸いです。セッションクッキーはセキュリティに関連したものなので、Appleから離れたところに隠れているのは、アップルの意識的なデザイン選択です...)。

+0

最終的にNSHTTPCookiesStorageでいくつかのクッキーを見ることができたように見えます。しかし、セッションに必要なクッキーはそこにあるようには見えなかったので、サーバー側のクッキーに関する最後の点はおそらく起こっていることです。 – haplo1384

+0

ダング、それはあまりにも悪いです。おそらく、アプリが完全に再起動されたなら、あなたは積極的に再ログインしなければならないだろう。あなたがどこかでユーザーの資格情報を安全に保管する限り(私はキーチェーンを推奨します。理想的ではありませんが、適切な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を修正するまでは、少なくとも確実に動作する唯一のソリューションだと言えるでしょう。

私は良い3日間過ごそうとしていますキャッシュされたクッキーをWKWebViewから取り出して、私がどこにもいなくなったと言うことは言うまでもありません。最終的に、私はクッキーをサーバーから直接取得することができました。

私がしようとした最初の事はWKWebView内で実行されたJavaScriptを使用して、すべてのクッキーを取得し、その後、私はちょうどUserDefaultsにそれらを格納しますWKUserContentControllerに渡しています。これは、私のクッキー以来、httponlyと明らかにあなたはそれらを得ることができないので、私のクッキーは動作しませんでした...

私はそれをサーバー側のページにJavaScript呼び出しを挿入することで修正しました。私の場合は)クッキーをパラメータとして使用します。

sendToDevice("key:value")

上記JS関数は、単にデバイスにクッキーを通過しています。これが誰かが元気になれるのを助けてくれることを願っています...

関連する問題