iOS 18.4 模拟器的 URLSession bug

前情提要:https://developer.apple.com/forums/thread/777999 大致问题就是在iOS 18.4 sim里面,同样的请求发两遍,第二次请求会报错。经过简短的讨论,目前看来这个问题仅限于模拟器,真机并无此问题。 爱斯基摩大哥给了一个简单的补救方法,即禁止用HTTP/3协议来发送请求 var request = URLRequest(url: url) #if targetEnvironment(simulator) request.assumesHTTP3Capable = false #endif let response = try await self.session.data(for: request) 在app层面,还可以通过创建一个拦截器interceptor,来改变请求中的参数;再把这个拦截器设置到我们SDK的通用会话属性上: // Create a custom network interceptor. struct MyInterceptor: DataTaskInterceptor { func interceptRequest( details: any DataTaskRequestDetails ) async -> RequestInterceptionDisposition { var request = details.request #if targetEnvironment(simulator) request.assumesHTTP3Capable = false #endif // Ask for the modified request to be sent. return .performModifiedRequest(request) } } // Tell the `ArcGISURLSession` to use the custom interceptor. ArcGISURLSession.dataTaskInterceptor = MyInterceptor() 这样即使这个恶性bug最终进入了iOS production,我们的SDK也可以有办法不被影响。

Apr 1, 2025 - 22:19
 0
iOS 18.4 模拟器的 URLSession bug

前情提要:https://developer.apple.com/forums/thread/777999

大致问题就是在iOS 18.4 sim里面,同样的请求发两遍,第二次请求会报错。经过简短的讨论,目前看来这个问题仅限于模拟器,真机并无此问题。

爱斯基摩大哥给了一个简单的补救方法,即禁止用HTTP/3协议来发送请求

var request = URLRequest(url: url)
#if targetEnvironment(simulator)
    request.assumesHTTP3Capable = false
#endif
let response = try await self.session.data(for: request)

在app层面,还可以通过创建一个拦截器interceptor,来改变请求中的参数;再把这个拦截器设置到我们SDK的通用会话属性上:


// Create a custom network interceptor.
struct MyInterceptor: DataTaskInterceptor {
    func interceptRequest(
        details: any DataTaskRequestDetails
    ) async -> RequestInterceptionDisposition<(Data, URLResponse), any Error> {
        var request = details.request
        #if targetEnvironment(simulator)
            request.assumesHTTP3Capable = false
        #endif
        // Ask for the modified request to be sent.
        return .performModifiedRequest(request)
    }
}

// Tell the `ArcGISURLSession` to use the custom interceptor.
ArcGISURLSession.dataTaskInterceptor = MyInterceptor()

这样即使这个恶性bug最终进入了iOS production,我们的SDK也可以有办法不被影响。