Очистка кэша UIWebview



я использовал UIWebview для загрузки веб-страницы с помощью loadRequest: метод, когда я покидаю эту сцену, я называю [self.webView stopLoading]; и отпустите webView.



в мониторе активности при первом запуске я видел, что реальная память увеличилась на 4 МБ, а при нескольких запусках/загрузке реальная память не увеличивается. Он увеличивается только один раз.



Я проверил сохранить количество webview. Это правильно, т. е. 0. Я думаю, что UIWebView кэширует некоторые данные. Как избежать кэширования или удалить кэшированные данные? Или есть другая причина для этого?

651   9  

9 ответов:

я на самом деле думаю, что он может сохранять кэшированную информацию, когда вы закрываете UIWebView. Я пробовал удалить UIWebView от меня UIViewController, выпуская его, а затем создавая новый. Новый точно помнил, где я был, когда я вернулся по адресу, не перезагружая все (он помнил мой предыдущий UIWebView вошел в систему).

Итак, несколько предложений:

[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];

это приведет к удалению кэшированного ответа для конкретного запроса. Существует также вызов, который удалит все кэшированные ответы для всех запросов, выполненных на UIWebView:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

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

for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {

    if([[cookie domain] isEqualToString:someNSStringUrlDomain]) {

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}

Swift 3:

// Remove all cache 
URLCache.shared.removeAllCachedResponses()

// Delete any associated cookies     
if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}

не отключайте кэширование полностью, это повредит производительность вашего приложения, и это не нужно. Важно четко настроить кэш при запуске приложения и очистить его при необходимости.

так application:DidFinishLaunchingWithOptions: настроить ограничения кэша следующим образом:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    int cacheSizeMemory = 4*1024*1024; // 4MB
    int cacheSizeDisk = 32*1024*1024; // 32MB
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
    [NSURLCache setSharedURLCache:sharedCache];

    // ... other launching code
}

после того, как вы его правильно настроить, тогда, когда вам нужно очистить кэш (например,applicationDidReceiveMemoryWarning или когда вы закрываете UIWebView) просто делать:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

и вы увидите памяти восстановленный. Я написал об этой проблеме здесь: http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

вы можете отключить кэширование следующим образом:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

Swift 3.

// Remove all cache 
URLCache.shared.removeAllCachedResponses()

// Delete any associated cookies     
if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}

мое образованное предположение заключается в том, что использование памяти, которое вы видите, не связано с содержимым страницы, а скорее с загрузкой UIWebView и все это поддерживает библиотеки WebKit. Мне нравится элемент управления UIWebView, но это "тяжелый" элемент управления, который тянет очень большой блок кода.

этот код является большим подмножеством браузера iOS Safari и, вероятно, инициализирует большое количество статических структур.

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

конкретные кэши приложений хранятся в ~/Library/Caches/<bundle-identifier-of-your-app>, Так что просто удалите, как показано ниже, и снова откройте приложение

rm -rf ~/Library/Caches/com.mycompany.appname/

после различных попыток, только это хорошо работает для меня (под ios 8):

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];

для swift 2.0:

let cacheSizeMemory = 4*1024*1024; // 4MB
let cacheSizeDisk = 32*1024*1024; // 32MB
let sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "nsurlcache")
NSURLCache.setSharedURLCache(sharedCache)

я загружаю html-страницы из документов, и если они имеют то же имя css-файла UIWebView кажется, он не бросает предыдущие правила css. Может быть, потому что у них один и тот же URL или что-то в этом роде.

Я попытался это:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

Я попытался это :

[[NSURLCache sharedURLCache] removeAllCachedResponses];

я загружаю начальную страницу с:

NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];

он отказывается выбрасывать свои кэшированные данные! Разочарование!

Я делаю это внутри приложения PhoneGap (Cordova). У меня есть не пробовал его в изолированном UIWebView.

Update1: я нашел этой.
Изменение html-файлов, хотя и кажется очень грязным.

Comments

    Ничего не найдено.