0

我試圖使用URLSessionDataTask來訪問我的後端API。其中一部分包括訪問使用Safari存儲的Cookie。使用URLSessionDataTask時,Cookie不存在

例如,在後臺爲http://api.example.com/v1/getCookies PHP代碼是

echo $_COOKIE["myCookieName"]; 

的餅乾iOS上的Safari瀏覽器確實存在,但是當一個URLSessionDataTask請求發送到網站製作

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() 

代替作爲對請求的響應發送的cookie的值,響應是cookie未被設置。好像來自URLSessions的Cookie與Safari中的Cookie分開。

Cookie存儲在域.example.com和路徑/下。

有沒有什麼辦法可以從我的應用程序訪問在Safari上設置的Cookie?例如,我想是這樣的工作(我做的更復雜的東西,但是這實質上顯示我想什麼去上班)

  1. 用戶訪問example.com和選擇一個暱稱
  2. 用戶選擇的暱稱存儲在cookie
  3. 用戶決定下載example.com移動應用
  4. 的應用發出example.com的請求,並存儲在cookie中返回的綽號

有沒有辦法做這樣的事情? HTTPCookie.cookiesHTTPCookieStorage.shared.cookies都不起作用。

回答

0

試試這個配置。

var configuration = URLSessionConfiguration.default 
configuration.httpShouldSetCookies = true 
configuration.httpCookieAcceptPolicy = NSHTTPCookieAcceptPolicy.OnlyFromMainDocumentDomain 
+0

不幸的是,這並不工作,我得到了相同的結果 – Jojodmo

0

我不能完全肯定這是你努力實現什麼,而是你可以作出符合要求的ephemeral session

短暫會話類似於默認會話,但不寫 緩存,cookie或磁盤憑證。

這樣cookie不會被存儲,因此服務器每次都會響應一個新的cookie。希望這會使它在URLSession響應中返回你想要的cookie。在代碼:

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

不幸的是,那也不行,這是因爲如果訪問使用'URLSession'網頁時不再存在的那名使用Safari設置的cookie。 – Jojodmo

1

Coockies不能在不同的應用程序之間共享,但如果你使用你的應用程序中的web瀏覽器可以achived。

如果您想從Web視圖或SFSafariViewController攔截cookie以便通過URLSession將其用於其他請求,您應該實現自定義URL協議。查看更多詳情 https://www.raywenderlich.com/59982/nsurlprotocol-tutorial 因此,您的應用程序內的任何請求/響應都可以被攔截(甚至可以從Web視圖或任何URL會話中),並且Cookie和其他標題將可供您使用。例如,您可以從Web視圖開始認證,攔截響應中的Cookie並將其用於您應用中的其他請求。

+0

謝謝!你知道有什麼方法可以把這個觀點在「背景」,可以這麼說,這樣用戶仍然可以與應用程序交互,他們沒有注意到有什麼? – Jojodmo

+0

你可以做到這個網頁視圖不可見。加載你需要的東西,甚至讓它在加載的頁面上運行一些JS。即使這個腳本不會在頁面存在,您可以創建JS腳本字符串和使用方法evaluateJavaScript:completionHandler:運行它。例如提交表單。 –

+0

因此,例如,我可以創建一個Web視圖,調用evaluateJavaScript方法,然後立即關閉該網頁視圖,使其對用戶不可見?如果用戶沒有WiFi或蜂窩服務,或者在飛機模式下正確,這也可以工作。 – Jojodmo

相關問題