Подтвердить что ты не робот

Предотвращение ответов NSURLSession на кеширование

Почему он кэширует ответы. Он возвращает ранее полученные ответы. Он работает даже при отключении сетевого соединения. Сброс симулятора iOS тоже не работал. Выполнение запроса, а затем с помощью интернет-оффлайн работает (кэшируется).

public let urlSession: NSURLSession

public init()
{
    // ...

    var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    urlSession = NSURLSession(configuration: configuration)
}

func makeRequest(path: String, httpMethod:String, body:String?, baseUrl: String?, headers:[String:String]=[:], callback: JsonRequestCallback)
{
    let urlString = (baseUrl ?? customOAuth2Manager.API_URL) + path
    let url = NSURL(string: urlString)
    let request = oauthInstance.request(forURL: url!)

    request.HTTPMethod = httpMethod
    self.customOAuth2Manager.setupRequest(request)

    for (key, value) in headers {
        request.setValue(value, forHTTPHeaderField:key)
    }

    if let body = body where body != "" {
        let postData = (body as NSString).dataUsingEncoding(NSUTF8StringEncoding)
        request.HTTPBody = postData
    }

    let task = urlSession.dataTaskWithRequest(request) { data, response, error in
        self.parseData(data, response:response, error:error, body:body, callback: callback)
    }
    task.resume()
}

Обновление

Мне удалось решить это, вызвав этот код из didFinishLaunching в AppDelegate:

func removeUrlCache()
{
    NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil))
}

Однако мне все еще интересно, почему мой исходный код не работает. Также кажется немного уродливым, чтобы отключить кеш для всего приложения, чтобы решить мою проблему.

4b9b3361

Ответ 1

Спасибо за вопрос. Это поставило меня на правильный путь.

NSURLCache.sharedURLCache() предоставляет больше возможностей, и для этого вам не нужно менять емкость памяти и дисков.

Вы можете удалить все кэшированные ответы. Работает для меня.

URLCache.shared.removeAllCachedResponses()

Или вы можете удалить кеш для одного ответа. Не работает для меня iOS 9.

let request = URLRequest(url: URL(string: url)!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10)
    URLCache.shared.removeCachedResponse(for: request)

//Do your request here

Я надеюсь, что это поможет кому-то!

Изменить: NSURLCache.sharedURLCache().removeCachedResponseForRequest(request), к сожалению, не работает для меня

Моя альтернатива была: я использую это для обновления, и я отслеживаю дату последнего обновления. Поэтому я использовал следующий код:

 URLCache.shared.removeCachedResponses(since: lateUpdate)

Но по какой-то причине это не работает эфир.

Начиная с iOS 8, методы удаления одного кэша, похоже, не работают: fooobar.com/questions/202483/...

2019-05-24, обновление до Swift 5.

Ответ 2

Не уверен, что это фактически предотвращает перехват или просто заставляет новую перезагрузку каждый раз, но это то, что сработало для меня:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

Вот скриншот, показывающий другие варианты в случае, если кто-то может понадобиться им:

введите описание изображения здесь

Ответ 3

Я бы реализовал URLSessionDelegate и вызвал завершение Block с nil в реализации делегата willCache. Это ваши просьбы никогда не будут чечены