0

URLSessionDataTaskを使用してバックエンドAPIにアクセスしようとしています。これには、Safariを使用して保存されたCookieへのアクセスも含まれます。 URLSessionDataTask要求がURLSessionDataTaskを使用しているときにCookieが存在しない

let url: URL = URL(string: "http://api.example.com/v1/getCookies")! 

let task = Foundation.URLSession(
    configuration: URLSessionConfiguration.default, 
    delegate: self, 
    delegateQueue: OperationQueue.main 
).dataTask(with: url) 

task.resume() 

代わりのウェブサイトに行われたとき

例えば、http://api.example.com/v1/getCookiesためのバックエンドでのPHPコードは、iOSのSafari上に存在しない

echo $_COOKIE["myCookieName"]; 

クッキーで、まだクッキーの値がリクエストに対する応答として送信されている場合、レスポンスはクッキーが設定されていないということです。 URLSessionsのCookieがSafariのCookieとは別のようです。

クッキーはドメイン.example.comとパス/の下に格納されます。

私のアプリからSafariに設定されたクッキーにアクセスする方法はありますか?例えば、私が動作するように、このようなものを(私はより複雑な何かをやっているが、これは基本的に私は働きたいかを示して)

  1. ユーザーの訪問example.comをしてニックネームを選択したいと思います
  2. ユーザーの選択したニックネームがクッキーに保存されている
  3. ユーザーがexample.comモバイルアプリアプリがexample.comへの要求を行う
  4. 、と返されたクッキーに保存されているニックネームをダウンロードすることを決定した

このようなことをする方法はありますか? HTTPCookie.cookiesでもHTTPCookieStorage.shared.cookiesでも動作しないようです。

答えて

0

この設定で試してください。

私は、これはあなたが達成しようとするものですが、あなたは ephemeral sessionとの要求を行うことができる完全にわからない
var configuration = URLSessionConfiguration.default 
configuration.httpShouldSetCookies = true 
configuration.httpCookieAcceptPolicy = NSHTTPCookieAcceptPolicy.OnlyFromMainDocumentDomain 
+0

残念ながら、これはうまくいきません。同じ結果が得られます – Jojodmo

0

エフェメラルセッションは、デフォルトのセッションに似ていますが、 キャッシュを書きません、クッキー、または資格情報をディスクに保存します。

このようにして、Cookieは保存されないため、サーバーは毎回新しいCookieで応答します。うまくいけば、URLSessionの応答の中であなたが望むクッキーを返すようにします。コード内:

let task = Foundation.URLSession(
    configuration: URLSessionConfiguration.ephemeral, 
    delegate: self, 
    delegateQueue: OperationQueue.main 
).dataTask(with: url) 
+0

残念ながら、それは動作しません。また、「URLセッション」を使用してWebページにアクセスすると、Safariを使用して設定されたCookieは存在しなくなります。 – Jojodmo

1

コックを異なるアプリケーション間で共有することはできませんが、アプリ内でウェブブラウザを使用する場合は、それを実行することができます。

場合には、あなたがカスタムURLプロトコルを実装する必要がありますURLSessionを介して他の要求のためにそれらを使用するためにウェブビューまたはSFSafariViewControllerからのCookieを傍受します。より詳細にアプリ内の任意の要求/応答が(でもウェブビューまたは任意のURLセッションから)傍受することができ、結果として https://www.raywenderlich.com/59982/nsurlprotocol-tutorial とクッキーを参照してくださいと他のヘッダがあなたのために利用できるようになります。たとえば、Webビューから認証を開始し、応答のCookieを傍受し、アプリ内の他のリクエストに使用することができます。

+0

ありがとう!そのようなビューを「バックグラウンド」に入れる方法を知っていますか?言い換えれば、ユーザーはアプリとやりとりでき、何も気付かないでしょうか? – Jojodmo

+0

このWebビューを非表示にすることができます。必要なものをロードして、読み込まれたページ上でJSを実行することもできます。このスクリプトがページに存在しない場合でも、StringとしてJSスクリプトを作成し、evaluateJavaScript:completionHandlerメソッドを使用して実行することができます。たとえば、フォームを送信します。 –

+0

たとえば、Webビューを作成してevaluateJavaScriptメソッドを呼び出し、すぐにWebビューを閉じてユーザーに見えなくすることができますか?また、これは、ユーザーが無線LANやセルサービスを持たない場合、または飛行機モードになっている場合にも有効です。 – Jojodmo

関連する問題