iOS: удалять файлы cookie, но все же записывается в [дубликат]

Посмотрите на этот пример:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope,$http) {

    var getJoke = function(){
        return $http.get('http://api.icndb.com/jokes/random').then(function(res){
            return res.data.value;  
        });
    }

    getJoke().then(function(res) {
        console.log(res.joke);
    });
});

Как вы можете видеть, getJoke возвращает разрешенное обещание (оно разрешено при возврате res.data.value). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).

Это plnkr:

http://embed.plnkr.co/XlNR7HpCaIhJxskMJfSg/

15
задан Pankaj Gaikar 8 July 2015 в 10:22
поделиться

10 ответов

Apple выпустила новые API для iOS 9 , поэтому теперь мы можем удалить файлы cookie, определенные для домена, для WKWebView с кодом ниже, но это будет работать только на устройствах с iOS version 9 или later :

WKWebsiteDataStore *dateStore = [WKWebsiteDataStore defaultDataStore];
[dateStore fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataTypes]
                 completionHandler:^(NSArray<WKWebsiteDataRecord *> * __nonnull records) {
                     for (WKWebsiteDataRecord *record  in records)
                     {
                         if ( [record.displayName containsString:@"facebook"])
                         {
                             [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:record.dataTypes
                                                                       forDataRecords:@[record]
                                                                    completionHandler:^{
                                                                        NSLog(@"Cookies for %@ deleted successfully",record.displayName);
                                                                    }];
                         }
                     }
                 }];

Над фрагментом будет работать ] iOS 9 и позже. К сожалению, если мы используем WKWebView для версий iOS до iOS 9 , нам все равно придется придерживаться традиционного метода и удалять все хранилище файлов cookie, как показано ниже.

NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"];
NSError *errors;
[[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];
25
ответ дан Sarat Patel 25 August 2018 в 05:34
поделиться

Быстрая версия:

var libraryPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, false).first!
libraryPath += "/Cookies"

do {
  let result = try NSFileManager.defaultManager().removeItemAtPath(libraryPath)
  print(result)
} catch {
  print("error")
}
NSURLCache.sharedURLCache().removeAllCachedResponses()
-4
ответ дан Esqarrouth 25 August 2018 в 05:34
поделиться

WKWebview ничего не хранит внутри [NSHTTPCookieStorage sharedHTTPCookieStorage].

очистка WKWebsiteDataStore будет решением этой проблемы.

Тем не менее для IOS8, использующего WKwebview, этот метод неприменим. .

0
ответ дан Jeba Moses 25 August 2018 в 05:34
поделиться

В iOS9:

//// Optional data
NSSet *websiteDataTypes
= [NSSet setWithArray:@[
                        WKWebsiteDataTypeDiskCache,
                        //WKWebsiteDataTypeOfflineWebApplicationCache,
                        WKWebsiteDataTypeMemoryCache,
                        //WKWebsiteDataTypeLocalStorage,
                        //WKWebsiteDataTypeCookies,
                        //WKWebsiteDataTypeSessionStorage,
                        //WKWebsiteDataTypeIndexedDBDatabases,
                        //WKWebsiteDataTypeWebSQLDatabases
                        ]];
//// All kinds of data
//NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
//// Date from
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
//// Execute
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
    // Done
    NSLog(@"remove done");
}];
5
ответ дан Kingiol 25 August 2018 в 05:34
поделиться

Кажется, что NSHTTPCookieStorage теперь используется в iOS 8.2 для правильной очистки файлов cookie, если требуется. Я отправил приложение, которое запустило бы этот код до открытия входа на WKWebView:

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies])
{
    [storage deleteCookie:cookie];
}

. Где раньше, чем iOS 8.2, сайт автоматически регистрировался с использованием сохраненных файлов cookie, теперь он правильно спрашивает пользователя для повторного входа в систему. Все это произошло без отправки обновления в приложение. :)

0
ответ дан Rohit suvagiya 25 August 2018 в 05:34
поделиться

Swift 4 и более короткая версия:

let dataStore = WKWebsiteDataStore.default()
dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
    dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(),
                         for: records.filter { $0.displayName.contains("facebook") },
                         completionHandler: completion)
}
0
ответ дан Sergi Gracia 25 August 2018 в 05:34
поделиться

Свифт 3 ответа Сарата:

let dataStore = WKWebsiteDataStore.default()
dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { (records) in
    for record in records {
        if record.displayName.contains("facebook") {
            dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: [record], completionHandler: {
                print("Deleted: " + record.displayName);
            })
        }
    }
}
17
ответ дан Simon Epskamp 25 August 2018 в 05:34
поделиться

В дополнение к очистке файлов cookie в общем хранилище файлов cookie, я попробую очистить кеш (NSURLCache) и отбросить WKWebView и создать новый с новым WKProcessPool

1
ответ дан Subbu 25 August 2018 в 05:34
поделиться

Ответ Эскарута только частично прав. Правильная быстрая версия:

var libraryPath : String = NSFileManager().URLsForDirectory(.LibraryDirectory, inDomains: .UserDomainMask).first!.path!
libraryPath += "/Cookies"
do {
    try NSFileManager.defaultManager().removeItemAtPath(libraryPath)
} catch {
    print("error")
}
NSURLCache.sharedURLCache().removeAllCachedResponses()
0
ответ дан ykonda 25 August 2018 в 05:34
поделиться

Ни один из этих параметров не работал для меня, но я нашел тот, который сделал:

let config = WKWebViewConfiguration()
if #available(iOS 9.0, *) {
    config.websiteDataStore = WKWebsiteDataStore.nonPersistentDataStore()
} else {
     // I have no idea what to do for iOS 8 yet but this works in 9.
}

let webView = WKWebView(frame: .zero, configuration: config)
3
ответ дан Zack Shapiro 25 August 2018 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: