You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSURLSession重定向处理程序在watchOS上的行为差异问题

解决watchOS 4中NSURLSession重定向代理方法不触发的问题

我之前在适配watchOS 4的旧应用时,也碰到过和你一模一样的NSURLSession重定向代理不按预期调用的情况,折腾了好一阵才搞定,给你梳理下可能的原因和解决办法:

首先排查最常见的几个坑

  • 确认Session的创建方式:千万别用[NSURLSession sharedSession],这个系统共享的Session不会调用自定义的代理方法。你必须用带delegate参数的初始化方法创建Session,而且要把Session实例强引用持有(比如声明为类的property),不然Session被提前释放,代理方法根本不会触发:

    // 正确的Session创建方式
    @property (strong, nonatomic) NSURLSession *networkSession;
    
    // 初始化Session
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    self.networkSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
  • 检查代理方法签名是否完全正确:很多时候代理方法不触发是因为参数类型写错了,比如把NSHTTPURLResponse写成了NSURLResponse。正确的方法签名应该是:

    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler {
        // 你的处理逻辑
    }
    

正确处理重定向的逻辑

当你不需要跟随重定向时,一定要在代理方法里调用completionHandler(nil),这样系统才会终止重定向流程,同时你可以直接从传入的response参数里提取所需的响应头信息:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler {
    // 从响应头里提取你需要的信息
    NSDictionary *responseHeaders = response.allHeaderFields;
    NSString *targetInfo = responseHeaders[@"Your-Required-Header-Key"];
    
    // 终止重定向,传入nil即可
    completionHandler(nil);
    
    // 这里处理拿到的信息
    if (targetInfo) {
        NSLog(@"拿到需要的信息:%@", targetInfo);
        // 执行后续业务逻辑
    }
}

额外的排查点

如果上面的方法都试过还是不行,可以检查这两个地方:

  • 缓存策略影响:如果你的请求设置了缓存策略(比如NSURLRequestReturnCacheDataElseLoad),可能会直接返回缓存的响应,跳过重定向流程。可以临时把缓存策略改成NSURLRequestReloadIgnoringLocalCacheData测试一下。
  • watchOS后台网络限制:如果你的请求是在后台发起的,watchOS 4对后台网络有更严格的限制,可能会导致代理方法延迟调用或者不触发。可以先在前台测试确认逻辑正常,再处理后台场景。

内容的提问来源于stack exchange,提问作者JoGoFo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:59:04