使用URLSessionDataTask时,Cookie不存在

时间:2017-04-21 23:29:47

标签: swift cookies nsurlsession nsurlrequest nsurlsessiondatatask

我尝试使用URLSessionDataTask访问我的后端API。部分内容包括访问使用Safari存储的cookie。

例如,http://api.example.com/v1/getCookies后端的php代码是

echo $_COOKIE["myCookieName"];

在iOS Safari上存在Cookie,但是当向网站发出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中的昵称
  5. 有没有办法做这样的事情? HTTPCookie.cookiesHTTPCookieStorage.shared.cookies似乎都无效。

3 个答案:

答案 0 :(得分:1)

Coockies不能在不同的应用程序之间共享,但如果您在应用程序中使用Web浏览器,则可以实现它。

如果您想拦截来自Web视图或SFSafariViewController的cookie,以便通过URLSession将其用于其他请求,您应该实现自定义URL协议。有关详细信息,请参阅 https://www.raywenderlich.com/59982/nsurlprotocol-tutorial 因此,您的应用程序内的任何请求/响应都可以被截获(即使是从Web视图或任何URL会话),也可以使用cookie和其他标头。例如,您可以从Web视图启动身份验证,从响应中截取Cookie并将其用于您应用中的其他请求。

答案 1 :(得分:0)

尝试使用此配置。

// My function to modify the main query object
function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('formato');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'video', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'video'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );

答案 2 :(得分:0)

我不完全确定这是您尝试实现的目标,但您可以使用ephemeral session提出请求:

  

短暂会话与默认会话类似,但不写   缓存,cookie或凭据到磁盘。

这样就不会存储cookie,因此服务器每次都会响应一个新的cookie。希望这会使它在URLSession响应中返回您想要的cookie。在代码中:

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