我尝试使用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吗?例如,我喜欢这样的事情(我做了一些更复杂的事情,但这基本上显示了我想要的工作)
有没有办法做这样的事情? HTTPCookie.cookies
和HTTPCookieStorage.shared.cookies
似乎都无效。
答案 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)